次の場合が一致しない理由がわかりません。NullはAnyのインスタンスである必要がありますが、一致しません。誰かが何が起こっているのか説明できますか?
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case _ => println("catch all")
}
prints catch all
ありがとう。
次の場合が一致しない理由がわかりません。NullはAnyのインスタンスである必要がありますが、一致しません。誰かが何が起こっているのか説明できますか?
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case _ => println("catch all")
}
prints catch all
ありがとう。
これはまさに指定どおりです。
Type patterns consist of types, type variables, and wildcards.
A type pattern T is of one of the following forms:
* A reference to a class C, p.C, or T#C.
This type pattern matches any non-null instance of the given class.
null が Any のメンバーであることに多くの関連性があると考えられているのは興味深いことです。AnyVal と Nothing を除くすべての型のメンバーです。
何かv
のプレースホルダーを試しましたか?
val x = (2, null)
x match {
case (i:Int, v) => println("got tuple %s: %s".format(i, v))
case _ => println("catch all")
}
それは指定されているとおりです(Scala Reference 2.7、セクション8.2):
クラス C、pC、または T#C への参照。この型パターンは、指定されたクラスの null 以外のインスタンスと一致します。クラスのプレフィックスが指定されている場合は、クラス インスタンスの決定に関連することに注意してください。たとえば、パターン pC は、パス p を接頭辞として作成されたクラス C のインスタンスのみに一致します。
私はscalaの専門家ではないので、ここで推測していますが、scalaのAnyクラスのドキュメントによると、nullはオブジェクトではないため、Anyから派生したものではなく、Anyから派生したものではないと考えています。最初にリストされたケースに一致します。
以下のコードサンプルを追加します。実行時に「何か他のもの」を出力します。
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case (i:Int, null) => println("something else %s".format(i))
case _ => println("catch all")
}
さらに調査した結果、nullはAnyを拡張するAnyRefを拡張するとドキュメントに記載されている意味と一致するはずです。
編集:他のみんなが言ったように。最初のケースは、意図的にnullと一致しません。ドキュメントで指定されています。