我写了一段测试用的代码:
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 x ~ ":" ~ y => (x, y) }
它不是匹配关键字,但^^看起来像匹配.我知道部分功能,我可以通过这种方式使用案例:
object C extends App { def a(f: Int => Int) = { f(3) } a(x => x + 1) a { case x => x + 1 } }
但他们都是不同的:
^^功能像匹配,其可在使用前内容^^后面匹配的内容的情况下
情况下在^^函数可以使用功能(如〜)
如何编写^^等自定义函数?你能写一个具体的例子吗?非常感谢!
这只是语法糖.在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)