8

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
4

5 に答える 5

2

フランクの答えが言うように、それは可能ですが、汚い方法で行うと費用がかかります。

それはあなたが何をしたいかによります。その「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
}

このコードはテストされていませんが、アイデアは得られます。

于 2013-02-01T10:18:08.323 に答える
0

あなたが必要とするのは、優先順位を付けたある種のコマンド実行である場合、私は提案することができます

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つだけが必要です

于 2013-02-01T10:46:32.623 に答える