为什么在情况1正常的情况下情况2导致“未绑定占位符参数”?
val h: (Int => Int) = (x:Int) => { scala.util.Random.nextInt(x) }
val _h: (Int => Int) = { scala.util.Random.nextInt(_) }
h(5) // 3
_h(5) // 3
val f: (Int => Int) = (x:Int) => { x }
f(5) // 5
// Causes error
val _f: (Int => Int) = { _ } <----- unbound placeholder parameter
答案 0 :(得分:1)
_
在Scala中从不解释为x => x
。
如果我正确理解language spec中有关“绑定下划线部分”的部分,那恰恰是因为Scala为部分应用保留了_
。就像在scala.util.Random.nextInt(_)
的情况下一样,它表示x => nextInt(x)
而不是nextInt(x => x)
。
答案 1 :(得分:1)
.nextInt(_)
不是占位符用法的示例。在这种情况下,下划线_
用于nextInt()
方法的“ eta扩展”,即将该方法提升为适当的功能。结果等同于以下内容:
val _h: (Int => Int) = util.Random.nextInt
要使您的_f()
代码正常工作,您可以这样做。
val _f: (Int => Int) = identity