Scala和unapply函数的参数

Jak*_* M. 1 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(". ")
}
Run Code Online (Sandbox Code Playgroud)

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

// ...
case /* val x = i */ MatchLess(x) => print(x + " ") // line 8
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 7

当你写下case MatchLess(x) => ...意思如下:

  1. 执行unapply方法
  2. 如果成功,绑定变量(这里x)被返回的值unapply这里iSome(i)(ohterwise,该模式不匹配,去下面.

所以在你的特定情况下,它x被绑定到相同的值i.但是如果代替Some(i)函数MatchLess.unapply返回其他东西(例如Some(42))x将被绑定42.