如何将字符串与scala中的方法结果匹配?

时间:2013-08-19 04:38:02

标签: scala match case

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

我应该定义案例类吗?

2 个答案:

答案 0 :(得分:4)

案例中使用的值不能是函数调用。你可以通过几种方式实现自己想要的目标。在匹配代码之前将val定义为等于方法调用的结果,并在case语句中使用该val(请注意,val名称需要以capitol字母开头,因为这是告诉编译器使用的特殊语法val,而不是简单地将名称分配给测试中的vlaue),如下所示:

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")

答案 1 :(得分: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(", ") )