Scala和unapply函数的参数

时间:2012-07-27 05:53:25

标签: scala

我有一个简单的unapply,检查整数是否小于10

object MatchLess {
    def unapply(i: Int): Option[Int] = if ( i < 10 ) Some(i) else None
}

// so this prints
// 7 8 9 . . .
for ( i <- 7 to 12 ) i match {
    case MatchLess(x) => print(x + " ") // line 8
    case _ => print(". ")
}

我对unapply语法有疑问:为什么在第8行的case中,值x实际上在=>的两边都可见?我可以假设编译器隐式添加这样的赋值吗?

// ...
case /* val x = i */ MatchLess(x) => print(x + " ") // line 8

2 个答案:

答案 0 :(得分:7)

当你写case MatchLess(x) => ...时,含义如下:

  1. 执行unapply方法
  2. 如果成功,则将变量(此处为x)绑定到unapply返回的值i Some(i)(此时,模式不匹配) ,请转到以下内容。
  3. 在您的特定情况下 x绑定的值与i相同。但是,如果函数Some(i)代替MatchLess.unapply而返回其他内容(例如Some(42)),则x将绑定到42

答案 1 :(得分:2)

查看the language spec,关于模式匹配的第8部分:

Syntax:
Pattern ::= Pattern1 { ‘|’ Pattern1 }
Pattern1 ::= varid ‘:’ TypePat
| ‘_’ ‘:’ TypePat
| Pattern2
Pattern2 ::= varid [‘@’ Pattern3]
| Pattern3
Pattern3 ::= SimplePattern
| SimplePattern {id [nl] SimplePattern}
SimplePattern ::= ‘_’
| varid                                                 // <- 2)
| Literal
| StableId
| StableId ‘(’ [Patterns] ‘)’                           // <- 1)
| StableId ‘(’ [Patterns ‘,’] [varid ‘@’] ‘_’ ‘*’ ‘)’
| ‘(’ [Patterns] ‘)’
| XmlPattern
Patterns ::= Pattern {‘,’ Patterns}

MatchLess(x)被标识为SimplePattern(1),并且根据上述,括号之间的表达通过模式 - &gt;来识别。模式 - &gt; Pattern1 - &gt; Pattern2 - &gt; Pattern3 - &gt; SimplePattern - &gt; varid(2)。此变量模式描述为:

  

变量模式 x 是一个简单的标识符,以较低的开头   案件信。它匹配任何值,并将变量名称绑定到该值   值。 x的类型是给定的模式的预期类型   外部。

在您的示例中,unapply上调用i结果绑定到x