在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"
}
Option[T]
的提取器意味着仅使用一个参数匹配模式。Foo()
在这里是什么意思?它等同于Foo(_)
?换句话说,什么是支持经验行为的语言规则。
答案 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)
:
http://www.scala-lang.org/files/archive/nightly/docs-master/library/#scala.util.matching.Regex