Scala:如何使用不带匹配关键字的大小写关键字?

时间:2016-01-05 11:03:04

标签: scala pattern-matching

我写了一段用于测试的部分代码:

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 }
}

但他们都不同:

  1. ^^ 类似匹配的功能,可以使用 ^^ 之前的内容匹配案例背后的内容
  2. ^^函数中的
  3. case 可以使用函数(如
  4. 如何编写^^等自定义功能?你能写一个具体的例子吗?非常感谢!

2 个答案:

答案 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