首页 文章

Scala模糊与无人函数调用

提问于
浏览
4

请原谅长时间的设置 . 这个问题与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 回答

  • 1

    我已经在Scala问题跟踪器上提交了一个错误,并且共识似乎是这种行为是一个错误 . 编译器应该抛出关于“my.something”的模糊引用的错误 .

相关问题