为什么在Scala中下划线不像我期望的那样展开

  • 本文关键字:期望 Scala 下划线 scala
  • 更新时间 :
  • 英文 :


这是我的代码。

def f(x: Int) = x
val a = List(List(1), List(2, 2))
val b = a map { f(_.length) } // error
val c = a map { item => f(item.length) } // no error

错误发生在计算b时,似乎编译器以以下方式展开代码:

val b = a map { f(x => x.length) } // absolutely wrong

这就是为什么会出现错误。正确的展开与我计算c时所做的类似。然而,当函数f不期望函数时,编译器如何扩展f的函数?

对我来说,这种扩展没有任何意义。有人能解释这种行为吗?谢谢!

然而,当函数f不期望函数时,编译器如何为f扩展函数?

因为这个展开发生在输入之前:编译器还不知道f期望什么。这是一件好事,因为1)当阅读代码时,你不需要知道f是否期望函数理解它将如何展开;2)改变f的类型并不会从根本上改变代码的含义。

最新更新