1

私はしばしば次の問題に直面します。

val b = a match {
  case Some(a) => "1"
  case None => "n"
}
val c = a match {
  case Some(a) => "2"
  case None => "n"
}

明らかに、マッチは 1 回しか必要ではありませんが、2 回実行されます。コンパイラがこれを考慮していることを確認するにはどうすればよいですか?

4

2 に答える 2

8

パフォーマンスが向上するとは思いませんが、次のようにコードを記述できます。

val (b, c) = a match {
  case Some(a) => ("1","2)
  case None => ("n", "n")
}
于 2013-04-10T17:57:21.030 に答える
1

一致は非常に高速で、if ステートメントに匹敵します。難しい試合でない限り、作業を 2 回行う心配はありません。

別のケースよりもデフォルトに一致させる方が少し簡単なので、パラメーターが本当に必要ない場合は、最善の策です

val b = a match { case None => "n"; case _ => "1" }
val c = a match { case None => "n"; case _ => "2" }

これは、多くの場合、次のような可変ソリューションよりも優れています。

var b,c = "n"
a match { case Some(_) => b = "1"; c = "2"; case _ => }

タプル作成よりも確実に優れています。

一致に時間がかかる場合は、om-nom-nom で既に示したように、結果を保存してタプルまたは他の適切なデータ構造で返す必要があります。文脈によっては、これがより明確になる場合もあります。

于 2013-04-10T18:11:05.503 に答える