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) => ...
| 归档时间: |
|
| 查看次数: |
3894 次 |
| 最近记录: |