どちらのタイプも、何も返さない関数を示しますUnit
。Nothing
それらの違いは何ですか?
4 に答える
Unit
は、値が1つだけのタイプです。「ユニットタイプ」を参照してください。一方、可能な値Nothing
はありません-ボトムタイプを参照してください。
何も返さない関数は、returntypeを持っている必要がありUnit
ます。その場合Nothing
、関数は結果を返すことができませんでした。関数を終了する唯一の方法は、例外によるものです。
Nothing
別の方法で使用されます。それは2つの特性によって特徴付けられます:
Nothing
他のすべてのタイプ(を含むNull
)のサブタイプです。- このタイプのインスタンスは存在しません。
これはいつ役に立ちますか?考えてみてくださいNone
:
object None extends Option[Nothing]
Option
はその型パラメーターで共変でありNothing
、すべてOption[Nothing]
のサブタイプであるため、はすべてのタイプのサブOption[A]
タイプA
です。したがって、すべてNone
ののサブタイプである1つのオブジェクトを作成できます。インスタンス化できないため、これは合理的であり、常に値がありません。同様にOption[A]
A
Nothing
Option[Nothing]
object Nil extends List[Nothing]
Unit
論理的真理に対応し、カリー・ハワード同形性Nothing
の下で論理的真理に対応します。ここでは、型を命題と見なし、関数を証明と見なします。
Unit
つまり、(a)関数には入力や出力などの副作用があり、(b)これらの副作用が関数の主な目的です。もちろん、関数のタイプが。と異なっていても、関数には副作用がありますUnit
。
Nothing
はScalaの特殊な型です。これは、(a)値がない(Unitには値が1つだけある- ()
)ため、型の値を返すことができないためNothing
、(b)他のすべての型のサブタイプであるためです。つまり、何かがタイプNothing
を持っている場合、他のタイプの代わりに(サブタイピングを介して)使用できますが、結果は生成されません。これは、例外を処理するのに役立ちますthrow
。式のタイプはNothing
、であるため、プログラムのどこでも使用できます。
簡単に言うNothing
と、プログラムのエラーまたは終了があり、何も返されないことをUnit
意味し、副作用があったことを意味しますが、実行は正常に終了し、結果はありません。
Scalaでのプログラミングには、その良い説明があります。
Petrの応答に1つの側面を追加するには、次Nothing
のようにします。タイプ階層で重要な役割を果たします。ボトムタイプです。これは、他のすべてのタイプのサブタイプであることを意味します。これは、すべてのスーパータイプであるの反対のようなAny
ものです。あなたはここで素晴らしい説明を見つけることができます。
単位
単位はJavaの無効と同じです。javaのvoidはキーワードですが、UnitはKotlinのオブジェクトです。
これで、関数がKotlinでUnitを返す場合、それは意味のあるものを何も返さないことを意味します。その関数は一連のコードを実行し、実行フローを返します。
何もない
まったく別の種類のものはありません。Javaでは何とも関連付けることができません。JavaにはNothingのようなものはありません。
実行の終了を意味するものはありません。関数がNothingを返す場合、文字通り何も返さないことを意味します。実行フローすらありません。
ブラックホールのようなものはなく、入ってくるものは出てこない、光さえも出てこない(ここでは光は「実行の流れ」である)。ユニットの場合、最も少ない光が出ます。
したがって、関数がNothingを返す場合、コードのフローはそこで終了し、その後に書き込まれるものはすべて到達不能になります。
次のコードを参照してください。
fun main() {
unitFun()
println("after unit")
nothingFun()
println("after nothing") //you get warning here saying "unreachable code"
}
fun nothingFun(): Nothing {
println("inside nothing")
throw Exception()
}
fun unitFun(): Unit {
println("inside unit")
}
出力は
inside unit
after unit
inside nothing
Exception in thread "main" java.lang.Exception
注:書くとすぐに警告が表示されます
println("after nothing") UnReachable Code
そして、あなたはその理由を知っています、それはnothingFunが実行フローを送り返さないからです。
ここでこれを完了するもう1つのことは、Nothingを返す関数は、いかなる種類の例外もスローする必要がないということです。
理由:一般的なステートメントを記述した場合(例外をスローしない場合)、関数は戻り型に一致し、Nothingを返すものはありません。つまり、実行フローを吸い込み、決して返さないものはありません。戻る。すべてが何かを返します、ユニットでさえ何かです。
これで、クラスは何もないと言えるので、オブジェクトを作成してそれ自体を返すことができます。Nohhhhhhh?大きなnohhhh?
コンストラクターが1つあるクラスはありませんが、プライベートであるため、そのオブジェクトを作成することもできません。
最後のビット
舞台裏では、ユニットは逆コンパイルされたバイトコードでvoid(small v)に変換されますが、NothingはVoid(capital V)に変換されます。
以下のコードを参照してください。
var user = null //First
var user : User? =null //Second
ここで、2番目のステートメントは、Nullable-Userタイプのユーザーを示しています。最初のステートメントのユーザーのタイプは何ですか?
何か推測?
Nullable-Nothingタイプです。
最初のステートメントを次のように見てみてください
var user : Nothing? = null
今、ボンネットの下で何が起こっているのか、
Void user = (Void)null; //First
User user = (User)null; //Second