零arg模式匹配一​​个arg预期

时间:2013-12-08 22:12:17

标签: scala pattern-matching

在Scala中给出了这个定义:

class Foo(val n: Int)

object Foo {
  def unapply(foo: Foo): Option[Int] = Some(foo.n)
}

此表达式编译并返回ok

new Foo(1) match {
  case Foo() => "ok"
}
  1. 为什么这甚至编译?我希望带有Option[T]的提取器意味着仅使用一个参数匹配模式。
  2. 模式Foo()在这里是什么意思?它等同于Foo(_)
  3. 换句话说,什么是支持经验行为的语言规则。

2 个答案:

答案 0 :(得分:2)

the Scala Language Reference的第8.18节讨论了这种类型的模式匹配。根据该引用,对于像Foo()这样的模式,它应该仅在unapply返回布尔值时匹配。如果unapply为某些不是元组的T返回Option[T],则该模式必须包含一个参数,例如Foo(_)。除非我真的误解了这里发生的事情,否则看起来这是编译器违反规范的边缘情况。

答案 1 :(得分:2)

今天(2.11里程碑)你得到错误:

<console>:15: error: wrong number of patterns for object Foo offering Int: expected 1, found 0
                case Foo() => "ok"
                     ^

我在添加Regex.unapply(c: Char)时遇到了这个问题。在某些时候,你指出的案件被接受,然后被拒绝。我记得我喜欢这样的想法:如果我的提取器返回Some(thing),那么布尔匹配case r()将与case r(_)的工作方式相同。

unapply(Char)

的scaladoc中有用

http://www.scala-lang.org/files/archive/nightly/docs-master/library/#scala.util.matching.Regex