3

Some オブジェクトが None または渡されたオブジェクトの 1 つになる可能性があるという事実を知っています。None ではないという事実を考慮して、 Some オブジェクトからフィールドを抽出する理想的な方法は何ですか? フィールドの1つとして「日付」を持つクラス「At」を作成しました。Some クラスには Product トレイトを含む mixin があるため、次のようにするとうまくいきます。

(An object with return type Some(At)).productElement(0).asInstanceOf[At].date

しかし、これを行うための理想的な方法はありますか?

4

2 に答える 2

7

を安全に使用する方法がいくつかありますOption。含まれている値を取得する場合はfoldgetOrElseまたはパターン マッチングを使用することをお勧めします。

opt.fold { /* if opt is None */ } { x => /* if opt is Some */ }

opt.getOrElse(default)

// matching on options should only be used in special cases, most of the time `fold` is sufficient
opt match {
  case Some(x) =>
  case None =>
}

値を変更して、 から抽出せずに別の場所に渡したい場合は、、などをOption使用でき、したがって for-comprehensions も使用できます。mapflatMapfilter / withFilter

opt.map(x => modify(x))

opt.flatMap(x => modifyOpt(x)) // if your modification returns another `Option`

opt.filter(x => predicate(x))

for {
  x <- optA
  y <- optB
  if a > b
} yield (a,b)

または、副作用を実行したい場合は、使用できますforeach

opt foreach println

for (x <- opt) println(x)
于 2013-12-20T09:29:46.667 に答える
0

次の 2 つの方法があります。

1) 「get」メソッドを使用できます。ただし、None がないことが 300% 確実な場合にのみ使用してください。あなたが得るようにjava.util.NoSuchElementException: None.get

val option: Option[At] = getAtMethod
val dateField = option.get.date

2) Option はモナドであるため、'map' メソッドを使用できます。

val option: Option[At] = ...
val optionalDate: Option[Date] = option map { _.date }

またはあなたはそれを使用することができます:

option map { at => myMethod(at.date) } 
于 2013-12-20T09:30:16.700 に答える