斯卡拉含糊不清的函数调用
问题描述:
打扰了很长的设置。这个问题涉及到,但没有回答,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.something
到my.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()
?
答
我已经在Scala问题跟踪器上提交了一个错误,并且共识似乎是这个行为是一个错误。编译器应该对关于“my.something”的模糊引用发出错误。
这是在“风格一点点”一章中的Atomic Scala中讨论的。如果一个方法没有参数,可以用括号定义或不定义。如果用圆括号定义,可以用或不用它们来调用。但是,如果没有括号定义,只能在没有括号的情况下调用它。风格约定是用括号定义方法,如果调用方法改变了对象的内部状态,或者在没有括号的情况下定义它们。在你设计的例子中,编译器似乎尽力根据包括括号在内的签名选择正确的函数。 – 2015-07-12 20:26:46