我有一个简单的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
答案 0 :(得分:7)
当你写case MatchLess(x) => ...
时,含义如下:
x
)绑定到unapply
返回的值i
Some(i)
(此时,模式不匹配) ,请转到以下内容。在您的特定情况下 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
。