【发布时间】:2013-06-23 20:07:48
【问题描述】:
我想了解为什么 eta 扩展(第 6.26.5 节)不适用于重载方法。例如,如果我有以下两种方法:
def d1(a: Int, b: Int) {}
def r[A, B](delegate: (A, B) ⇒ Unit) {}
我可以这样做:
r(d1)
但是,当重载r 时它将不再起作用:
def r[A, B](delegate: (A, B) ⇒ Unit) {}
def r[A, B, C](delegate: (A, B, C) ⇒ Unit) {}
r(d1) // no longer compiles
我必须将方法显式转换为部分应用的函数:
r(d1 _)
有什么办法可以通过显式转换来完成跟随?
def r[A, B](delegate: (A, B) ⇒ Unit) {}
def r[A, B, C](delegate: (A, B, C) ⇒ Unit) {}
def d1(a: Int, b: Int) {}
def d2(a: Int, b: Int, c: Int) {}
r(d1) // only compiles with r(d1 _)
r(d2) // only compiles with r(d2 _)
question有点类似,但没有完全解释。
【问题讨论】:
-
有趣!顺便说一句,我不认为“隐式转换”是在这里使用的正确术语(至少对于 Scala),因为没有涉及
implicit def。 -
我认为它叫做隐式η-conversion。
-
我觉得@gzm0 是对的,我把它改成了“自动”
-
它被称为 eta-expansion (§6.26.5) - 相应地更新了问题。
-
请注意,您可以使用
r[Int, Int](d1),尽管这比r(d1 _)更冗长
标签: function scala methods implicit-conversion