斯卡拉含糊不清的函数调用

问题描述:

打扰了很长的设置。这个问题涉及到,但没有回答,Scala: ambiguous reference to overloaded definition - best disambiguation?斯卡拉含糊不清的函数调用

我是很新,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.somethingmy.something(_)醒来斯卡拉高达然后才默默地忽略了不确定性:

 
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正是因为写(不更改原型,尤其是不要添加一个空的参数列表的原型之一),我怎么告诉斯卡拉,明确,我想要的something的第一个单参数版本作为参数传递给另一个调用?
  • 由于显然有两个令人满意的参数可以传递给map,为什么Scala编译器不会将歧义报告为错误?
  • 有没有办法可以禁用Scala的行为(有时并非总是)将foo.bar等同于foo.bar()
+1

这是在“风格一点点”一章中的Atomic Sc​​ala中讨论的。如果一个方法没有参数,可以用括号定义或不定义。如果用圆括号定义,可以用或不用它们来调用。但是,如果没有括号定义,只能在没有括号的情况下调用它。风格约定是用括号定义方法,如果调用方法改变了对象的内部状态,或者在没有括号的情况下定义它们。在你设计的例子中,编译器似乎尽力根据包括括号在内的签名选择正确的函数。 – 2015-07-12 20:26:46

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