2
object Test {
   def main(args: Array[String]) {
       val text = "str1"
       text match {
           case "str" => println("str")

           // how to match result return by 'test' methed?
           case test("str", 1) => println("str1")
        }
    }
    def test(str: String, i: Int): String = str + i
}

test()メソッドによって返された結果を一致させるにはどうすればよいですか?

テストメソッドはString-を返しますstr1

ケースクラスを定義する必要がありますか?

4

2 に答える 2

4

ケースで使用される値は、関数呼び出しであってはなりません。いくつかの方法で目的を達成できます。一致コードの前にメソッド呼び出しの結果に等しい値を定義し、その値を case ステートメントで使用します (これはコンパイラに使用するように指示する特別な構文であるため、val 名は大文字で始める必要があることに注意してください)。テスト中の値に名前を割り当てるだけではありません)、次のように:

val text = "str2"
val Check = test("str", 1)
text match {
    case "str" => println("str")

    // how to match result return by 'test' methed?
    case Check => println("str1")
}

または、次のように case ステートメントでフィルターを使用します。

case str if (str == test("str", 1)) => println("str1")
于 2013-08-19T04:51:23.740 に答える
1

カスタム マッチングを定義するには、エクストラクタ (メソッドを持つオブジェクトunapply) を定義する必要があります。文字列の解析が必要な実装。パーサーコンビネータを使用してそれを行うコードを次に示します。

case class StringAndNumber(string: String, number: Int)

object Test {
  def unapply(s: String): Option[StringAndNumber] = Parser(s)
}

object Parser extends scala.util.parsing.combinator.RegexParsers {

  def apply(s: String): Option[StringAndNumber] =
    parseAll(stringAndNumber, s) match {
      case Success(x, _) => Some(x)
      case _ => None
    }

  lazy val stringAndNumber = string ~ number ^^
    { x => StringAndNumber(x._1, x._2) }

  lazy val string = "[^0-9]*".r

  lazy val number = "[0-9]+".r ^^ { _.toInt }
}

def foo(s: String): String = s match {
  case "str" => "str"
  case Test(san) => s"${san.string}|${san.number}"
  case _ => "?"
}

// prints: "str, str|2, ?"
println ( Seq("str", "str2", "2str").map(foo(_)).mkString(", ") )
于 2013-08-19T05:48:32.110 に答える