如何在scala中将字符串与方法结果匹配?
如何匹配如何在scala中将字符串与方法结果匹配?,scala,match,case,Scala,Match,Case,如何匹配test()方法返回的结果 测试方法返回一个字符串-str1 我应该定义case类吗?case中使用的值不能是函数调用。你可以通过两种方式实现你想要的。在匹配代码之前定义一个与方法调用结果相等的val,并在case语句中使用该val(注意,val名称需要以大写字母开头,因为这是一种特殊语法,用于告诉编译器使用val,而不是简单地将名称分配给被测的VALUE),如下所示: object Test { def main(args: Array[String]) { val
test()
方法返回的结果
测试方法返回一个字符串
-str1
我应该定义case类吗?case中使用的值不能是函数调用。你可以通过两种方式实现你想要的。在匹配代码之前定义一个与方法调用结果相等的val,并在case语句中使用该val(注意,val名称需要以大写字母开头,因为这是一种特殊语法,用于告诉编译器使用val,而不是简单地将名称分配给被测的VALUE),如下所示:
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
}
或者在case语句中使用筛选器,如下所示:
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")
}
要定义自定义匹配,您需要定义一个提取器(具有
unapply
方法的对象)。实现这一点需要解析字符串。下面是一些使用解析器组合器实现这一点的代码:
case str if (str == test("str", 1)) => println("str1")
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(", ") )