我写了一段用于测试的部分代码:
class A extends JavaTokenParsers {
def str: Parser[Any] = stringLiteral ~ ":" ~ stringLiteral ^^
{ case x ~ ":" ~ y => (x, y) } //how to use case keyword like this?
}
object B extends A with App{
val s = """
"name": "John"
"""
println(parseAll(str, s))
}
我阅读了Scala Second Edition中 编程 的“第15章:案例类和模式匹配”,但我从未见过像 case 那样这样:
... ^^ { case x ~ ":" ~ y => (x, y) }
这不是匹配关键字,但^^看起来像匹配。我知道部分功能,我可以通过这种方式使用案例:
object C extends App {
def a(f: Int => Int) = {
f(3)
}
a(x => x + 1)
a { case x => x + 1 }
}
但他们都不同:
如何编写^^等自定义功能?你能写一个具体的例子吗?非常感谢!
答案 0 :(得分:5)
这只是语法糖。在scala中,您可以使用任何将单个参数作为二元运算符的方法。
示例:
class Foo(x: String) {
def ^^(pf: PartialFunction[String, Int]): Option[Int] =
if (pf.isDefinedAt(x)) Some(pf(x)) else None
}
val foo = new Foo("bar")
foo ^^ {
case "baz" => 41
case "bar" => 42
}
// result: Some(42)
答案 1 :(得分:2)
如前所述,您可以使用带有case关键字的块来创建部分函数。
val doubleIntGtThree: PartialFunction[Int, Int] = {
case x: Int if x > 3 => x * 2
}
doubleIntGtThree(4) // return 8
doubleIntGtThree(2) //throws a matchError