Scala模糊与无人函数调用

时间:2015-07-12 19:23:30

标签: scala

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

我希望通过调用与List("foo_X", "bar_X")所需的something参数匹配的map原型来打印String => ?。相反,输出为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 个答案:

答案 0 :(得分:1)

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