Scalaでは、some
というオブジェクトで?
というメソッドが呼び出されたことを示しています。通常、オブジェクトには?
というメソッドはありません。 null
を確認する?
メソッドを使用して、オブジェクトへの暗黙的な変換を独自に作成することができます。
implicit def conversion(x: AnyRef) = new {
def ? = x ne null
}
上記の意志は、本質的に、あなたは(がが?
メソッドを持っている)方法conversion
の右側に式にメソッド?
を呼び出している任意のオブジェクトを変換。たとえば、あなたが行う場合は、この:
"".?
コンパイラはString
オブジェクトが?
メソッドを持っていないことを検出し、およびにそれを書き直します:あなたは省略することができることに注意してください(インタプリタで
conversion("").?
イラスト.
)オブジェクトのメソッドを呼び出す:
scala> implicit def any2hm(x: AnyRef) = new {
| def ? = x ne null
| }
any2hm: (x: AnyRef)java.lang.Object{def ?: Boolean}
scala> val x: String = "!!"
x: String = "!!"
scala> x ?
res0: Boolean = true
scala> val y: String = null
y: String = null
scala> y ?
res1: Boolean = false
だから、あなたが書くことができます:
if (some ?) {
// ...
}
または引数がnull
でない場合は、オブジェクトに指定されたメソッドを呼び出します?
方法でオブジェクトへの暗黙的な変換を作成することができます - この操作を行います。その後、
scala> implicit def any2hm[T <: AnyRef](x: T) = new {
| def ?(f: T => Unit) = if (x ne null) f(x)
| }
any2hm: [T <: AnyRef](x: T)java.lang.Object{def ?(f: (T) => Unit): Unit}
scala> x ? { println }
!!
scala> y ? { println }
あなたができるようにします書き込み:
some ? { _.toString }
ビル(再帰的に)SOCの答えに、あなたは上記の例のx
上のパターンマッチを絞り込むことができますどのような?
D卵はx
の種類によって異なります。 :D
IMO、下記のダニエルの答えが最適です。 Scalaは、潜在的に空の値を扱うためのサポートを既にたくさん持っています。暗黙的に新しい '? '構文を作成するよりも、それを学び尽くす方が良いでしょう。 – Bill
'None'の代わりに' null'sを使う理由の1つは、パフォーマンス/メモリの使用です。あなたは 'Option'ラッパーを保持する代わりに暗黙の変換から短命のオブジェクトを即座に割り当てることをお勧めします。確かに、多くの人がJVM上にハイパフォーマンスコードを書いているわけではありませんが、それでもユースケースがあると思います。 – axel22