0

次の定義を使用します。

class Test {
  var activated: Boolean = false
}

def maybeTest(): Test = {
  if(...) {
    val res = new Test
    if(...) res.activated = true
  } else null
}

私はifこのような構造をたくさん持っています:

val myobject = maybeTest()
if(myobject != null && myobject.activated) {
  // Do something that does not care about the object
}

少し凝縮させていただきたいと思います。nullPointerException を回避するために、次のようなものを定義/記述する良い方法はありますか?

if(maybeTest() &&> (_.activated)) {
  ...
}

これをscalaで達成する最良の方法は何ですか?

4

3 に答える 3

2

このようなコードを Option で次のようにラップできます。

class Test(num: Int) {
  def someNum = num
}

val test: Test = null
Option(test).map(t => t.someNum)

この例では、変数が null の場合、None を取得します。それ以外の場合は、Some(value) で作業します

アップデート

オプションを使用したくない場合は、そのような関数を定義できます

class Test(num: Int) {
  def give = num
}

def ifDefAndTrue[T, K](obj: T)(ifTrue: T => Boolean)(then: => K) {
  if (obj != null && ifTrue(obj))
    then
}

あなたの場合、これは次のようになります。

val test = new Test // assuming that activated is false

ifDefAndTrue(test)(_.activate) {
  println("results in unit")
}

しかし、それには副作用があり、機能しません

于 2013-04-25T09:18:42.197 に答える
0

null ケースを適切に処理する暗黙のクラスを使用する最善の方法を見つけました (ただし、最も効率的な方法ではない可能性があります)。

implicit class CheckNull[T](obj: T) {
  def call(f: T => Unit): Unit = if(obj != null) f(obj) else ()
  def is(f: T => Boolean): Boolean = if(obj != null) f(obj) else false
}

したがって、タイプ セーフなメソッドを記述して、次の呼び出しを行うこともできます。

if(maybeTest() is (_.activated)) {
  ...
}
myObjectMaybeNull call (_.pause())

かっこで囲む(_.activated)必要があることに注意してください。

于 2013-09-17T21:45:23.813 に答える