模式匹配函数参数

Say*_*ald 9 scala pattern-matching

我有一个关于scala中这种模式匹配的问题:

val div: (Double, Double) => Double = {
  case (x, y) if y != 0 => x / y
}
Run Code Online (Sandbox Code Playgroud)

我已经理解了模式匹配在scala中的工作原理及其语法,但这个表达式让我发疯.编译器如何知道x和y是函数和模式匹配的参数?

0__*_*0__ 10

其规则在Scala语言规范的第8.5节"模式匹配匿名函数"中定义.如果使用具有模式匹配的匿名函数,则必须部分提供该类型.你这样说是类型(Double, Double) => Double,这是简写Function2[Double, Double, Double].

现在:

如果期望的类型是,则表达式被认为等同于匿名函数:scala.Function k [S1,…,Sk, R]

(x1:S1,…,xk:Sk) => (x1,…,xk) match {
  case p1 => b1 … case pn => bn
}

所以无论你的函数是什么,模式匹配都会传递函数参数的元组,因此你可以使用常规的元组提取器语法.

所以你的例子很简短

val div: (Double, Double) => Double = (a, b) => (a, b) match {
  case (x, y) if y != 0 => x / y
}
Run Code Online (Sandbox Code Playgroud)

要么

val div = (a: Double, b: Double) => (a, b) match {
  case (x, y) if y != 0 => x / y
}
Run Code Online (Sandbox Code Playgroud)

该命名提取参数x并y达到你的想象力.你决定如何调用提取器的结果元素,你也可以写case (foo, bar) => ...