"unbound placeholder parameter" 的解释
Explanation of "unbound placeholder parameter"
问题
为什么情况 2 导致 "unbound placeholder parameter" 而情况 1 正常?
案例一
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
_
在 Scala 中永远不会被解释为 x => x
。
如果我正确理解 language spec 中关于 "binding underscore sections" 的部分,那正是因为 Scala 为部分应用保留了 _
。就像 scala.util.Random.nextInt(_)
的情况一样,它意味着 x => nextInt(x)
而不是 nextInt(x => x)
.
.nextInt(_)
不是占位符用法的示例。在这种情况下,下划线 _
用于 nextInt()
方法的 "eta expansion",即将方法提升为适当的功能。结果等同于:
val _h: (Int => Int) = util.Random.nextInt
要使您的 _f()
代码正常工作,您可以这样做。
val _f: (Int => Int) = identity
问题
为什么情况 2 导致 "unbound placeholder parameter" 而情况 1 正常?
案例一
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
_
在 Scala 中永远不会被解释为 x => x
。
如果我正确理解 language spec 中关于 "binding underscore sections" 的部分,那正是因为 Scala 为部分应用保留了 _
。就像 scala.util.Random.nextInt(_)
的情况一样,它意味着 x => nextInt(x)
而不是 nextInt(x => x)
.
.nextInt(_)
不是占位符用法的示例。在这种情况下,下划线 _
用于 nextInt()
方法的 "eta expansion",即将方法提升为适当的功能。结果等同于:
val _h: (Int => Int) = util.Random.nextInt
要使您的 _f()
代码正常工作,您可以这样做。
val _f: (Int => Int) = identity