1

我有一个简单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:为什么在case第 8 行中,值x实际上在=>? 我可以假设编译器隐式添加了这样的赋值吗?

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

2 回答 2

7

case MatchLess(x) => ...的时候意思如下:

  1. 执行 unapply 方法
  2. 如果成功,则将变量 (here) 绑定到此处ofx返回的值(否则,模式不匹配,请转到以下内容。unapplyiSome(i)

因此,在您的特定情况下,与 .x绑定的值相同i。但是,如果不是Some(i)函数MatchLess.unapply返回其他东西(例如Some(42)) x 将被绑定到42.

于 2012-07-27T06:13:04.327 回答
2

查看语言规范,关于模式匹配的第 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),并且括号之间的表达式,根据上述,通过 Patterns -> Pattern -> Pattern1 -> Pattern2 -> Pattern3 -> SimplePattern -> varid (2) 来标识。这种可变模式被描述为:

变量模式x是一个以小写字母开头的简单标识符。它匹配任何值,并将变量名绑定到该值。x 的类型是从外部给出的模式的预期类型。

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

于 2012-07-27T06:15:10.827 回答