0

问题

为什么案例 2 会导致“未绑定的占位符参数”,而案例 1 可以?

情况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

案例2

val f: (Int => Int) = (x:Int) => { x }
f(5)     // 5
// Causes error
val _f: (Int => Int) = { _ }   <----- unbound placeholder parameter
4

2 回答 2

2

_永远不会像x => x在 Scala 中那样被解释。

如果我正确理解了语言规范中关于“绑定下划线部分”的部分,这正是因为 Scala 保留_了部分应用程序。就像在它的情况下scala.util.Random.nextInt(_)意味着x => nextInt(x)而不是nextInt(x => x)

于 2019-12-03T17:38:24.510 回答
2

.nextInt(_)不是占位符使用的示例。在这种情况下,下划线_用于方法的“eta 扩展”,nextInt()即将方法提升为适当的功能。结果等价于以下内容:

val _h: (Int => Int) = util.Random.nextInt

要使您的_f()代码正常工作,您可以这样做。

val _f: (Int => Int) = identity
于 2019-12-03T17:39:59.567 回答