Scalaパターンマッチングを使用して次のコードを書き直すことは可能ですか?
val ls: List[String] = ??? // some list of strings
val res = if (ls.contains("foo")) FOO
else if (ls.contains("bar")) BAR
else SOMETHING_ELSE
Scalaパターンマッチングを使用して次のコードを書き直すことは可能ですか?
val ls: List[String] = ??? // some list of strings
val res = if (ls.contains("foo")) FOO
else if (ls.contains("bar")) BAR
else SOMETHING_ELSE
フランクの答えが言うように、それは可能ですが、汚い方法で行うと費用がかかります。
それはあなたが何をしたいかによります。その「foo」または「bar」のインデックスを返しますか (たとえば)? 次に、次のようにします。
def indexOf[T]: (List[T], T) => Int = (ls, x) => ls match {
case Nil => -1
case e::es if( e.equals(x) ) => 0
case e::es => val i = indexOf( es, x ); if( i < 0 ) i else i + 1
}
このコードはテストされていませんが、アイデアは得られます。
あなたが必要とするのは、優先順位を付けたある種のコマンド実行である場合、私は提案することができます
def executeCommand(input: List[String]): Option[Unit] = {
val priorities = Map(
"foo" -> 1,
"bar" -> 2,
"baz" -> 3) withDefault(_ => 4)
def extractCommand(cmds: List[String]): Option[String] =
(cmds sortBy priorities).headOption
extractCommand(input) map {
case "foo" => println("found foo")
case "bar" => println("found bar")
case "baz" => println("found baz")
case _ => println("no known command")
}
}
この特定の実装では、意味のある結果は返されません (副作用のみに行きます) が、ケースが何らかの値を返す必要がある場合はOption
、メソッドの結果として にラップされていることがわかります。
追加のコメントに基づいて更新
def execute(input: List[String]): Option[String] = {
val commands: PartialFunction[String, String] = {
case "foo" => "result for foo"
case "bar" => "result for bar"
case "baz" => "result for baz"
}
(input find commands.isDefinedAt) map commands
}
これは、コマンドが排他的である場合にのみ機能します。input
リストには1つだけが必要です