请原谅长时间的设置 . 这个问题与Scala: ambiguous reference to overloaded definition - best disambiguation?有关,但未得到答复 .
我对Scala很陌生,有一件让我失望的事情就是Scala:
-
具有一流的功能
-
在使用没有任何括号参数列表的对象点表示法时调用函数(就好像函数是属性一样)
这两种语言功能令我感到困惑 . 看下面的代码:
class MyClass {
def something(in: String): String = {
in + "_X"
}
def something: String => String = {
case _ => "Fixed"
}
}
val my = new MyClass()
println(List("foo", "bar").map(my.something))
我希望通过调用与 map
所需的 String => ?
参数匹配的 something
原型打印 List("foo_X", "bar_X")
. 相反,输出是 List("Fixed", "Fixed")
- Scala 2.11调用无参数 something()
然后将其返回值传递给 map
.
如果我们注释掉 something
的第二个无参数原型,输出将变为预期结果,证明其他原型在上下文中是有效的 .
将空参数列表添加到第二个原型(使其成为 def something()
)也会更改行为 .
将 my.something
更改为 my.something(_)
将Scala唤醒之前它默默无视的模糊性:
error: ambiguous reference to overloaded definition,
both method something in class MyClass of type => String => String
and method something in class MyClass of type (in: String)String
match argument types (String)
println(List("foo", "bar").map(my.something(_)))
即使使用所谓的用于此目的的魔术尾随下划线也不起作用:
val myFun: (String) => String = my.something _
这导致:
error: type mismatch;
found : () => String => String
required: String => String
val myFun: (String) => String = my.something _
我的问题:
-
如果我完全按照书面编写
MyClass
(没有对原型进行任何更改,特别是不向其中一个原型添加空参数列表),我如何明确告诉Scala我希望something
的第一个单参数版本通过作为另一个电话的争论? -
由于显然有两个令人满意的参数可以传递给
map
,为什么Scala编译器不会将歧义报告为错误? -
有没有办法禁用Scala的行为(有时,并非总是)将
foo.bar
视为等同于foo.bar()
?
1 回答
我已经在Scala问题跟踪器上提交了一个错误,并且共识似乎是这种行为是一个错误 . 编译器应该抛出关于“my.something”的模糊引用的错误 .