4

変数がobj: Option[MyObject]あり、そこから複数の変数を抽出したい - オブジェクトが設定されていない場合は、デフォルト値を使用する必要があります。

現在、私は次のようにしています:

val var1 = obj match {
    case Some(o) => e.var1
    case _ => "default1"
}
val var2 = obj match {
    case Some(o) => e.var2
    case _ => "default2"
}
...

これは非常に冗長です。私は次のようにできることを知っています:

val var1 = if (obj.isDefined) obj.get.var1 else "default1"
val var2 = if (obj.isDefined) obj.get.var2 else "default2"

これはまだ奇妙に思えます。1 つの大きな一致を使用して、値オブジェクトまたはタプルを返すことができることを知っています。

しかし、私が気に入っているのは、これに似たものです。

val var1 = obj ? _.var1 : "default1"
val var2 = obj ? _.var2 : "default2"

これはどういうわけか可能ですか?

4

3 に答える 3

10

これはどう?

obj.map(_.var1).getOrElse("default1")

または、このスタイルを好む場合:

obj map (_ var1) getOrElse "default"
于 2011-08-18T13:34:03.147 に答える
2

もう 1 つのバリエーションは、Null オブジェクト パターンのバージョンを使用し、オブジェクトを直接使用することです。

//could also be val or lazy val
def myDefault = new MyObject {
  override val var1 = "default1"
  override val var2 = "default2"
}

val myObj = obj getOrElse myDefault

use(myObj.var1)
use(myObj.var2)
于 2011-08-18T19:52:17.593 に答える
0

オプションから複数の値を抽出するには、タプルを返し、抽出構文を使用することをお勧めします。

val (val1, val2) = obj.map{o => (o.var1, o.var2)}.getOrElse(("default1", "default2"))
于 2011-08-18T19:23:30.070 に答える