次の関数を取ります:
def fMatch(s: String) = {
s match {
case "a" => println("It was a")
case _ => println("It was something else")
}
}
このパターンはうまく一致します:
scala> fMatch("a")
It was a
scala> fMatch("b")
It was something else
私ができることは次のとおりです:
def mMatch(s: String) = {
val target: String = "a"
s match {
case target => println("It was" + target)
case _ => println("It was something else")
}
}
これにより、次のエラーが発生します。
fMatch: (s: String)Unit
<console>:12: error: unreachable code
case _ => println("It was something else")
これは、ターゲットは実際には入力が何であれ割り当てたい名前であると考えているためだと思います。2つの質問:
なぜこのような振る舞いをするのですか?適切な型を持つスコープ内の既存の変数を探してそれらを最初に使用することはできません。見つからない場合は、ターゲットをパターンマッチする名前として扱いますか?
これの回避策はありますか?変数に対してパターンマッチングを行う方法はありますか?最終的には大きなifステートメントを使用できますが、マッチケースの方がエレガントです。
関連:stackoverflow.com/questions/7083502/...
—
デイブ・L.
この質問、コード、回答はScala 2.12.xの時点で古くなっていると思います。該当するバージョンが質問の一部として言及されているとよいでしょう。
—
conny 2017年