2
val flag = false

if (val data = flag) {
  println(data)
}

内部にifステートメントを割り当ててflag、Scalaで自動的に評価されることは可能ですか?

4

2 に答える 2

6

はい、ただしスコープをエスケープしないため、if の本文では使用できません

if ({val data = true; data}) 
  println("data was true")

割り当ては値を返しませんが、代わりに値を返すことができます。のようなことをした方が良い

def test(data: Boolean) {
  if (data) {/* data in scope */} 
  else      {/* data in scope */}}
于 2012-10-11T06:08:48.833 に答える
3

あなたのケースや他の多くのケースに役立つ素晴らしい拡張機能があります。次の暗黙的な変換で実装できます。

implicit class AnyExtensions[A](val x: A) extends AnyVal {
  def asSatisfying(p: A => Boolean): Option[A] =
    if (p(x)) Some(x) else None
}

スコープにインポートすると、例で次のことができます。

flag.asSatisfying(_).foreach(println)

この回答で詳細に説明されているいくつかのより良い使用例があります。

この関数の主な利点は、中間変数を導入する必要性を効果的に排除できることです。これにより、「if-else」ロジックを 1 行の式として解決できるようになります。

于 2012-10-11T11:00:48.353 に答える