当前位置: 首页 > 知识库问答 >
问题:

无paren-less函数调用的Scala歧义性

梁盛
2023-03-14

原谅这么长时间的安排。这个问题与Scala有关,但没有得到它的回答:对重载定义的歧义引用--最好的消歧?.

我对Scala很陌生,有一件事让我很不爽,那就是Scala两者都是:

    null
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))
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个答案

尉迟默
2023-03-14

我已经在Scala问题跟踪器上提交了一个bug,一致认为这种行为是一个bug。编译器应该抛出一个关于对“My.Something”的不明确引用的错误。

 类似资料:
  • 我试图使用mockito在scala中模拟,如下所示 会有什么问题?

  • 问题内容: 我有一个重载的方法,该方法分别接受一个Consumer和一个Function对象,并返回与相应的Consumer / Function匹配的泛型类型。我以为这会很好,但是当我尝试使用lambda表达式调用任一方法时,我收到一条错误消息,指示对该方法的引用不明确。 基于我对JLS§15.12.2.1的阅读。确定潜在的适用方法:似乎编译器应该知道我的带空块的lambda与Consumer方

  • Scala 函数 Scala的解释器在解析函数参数(function arguments)时有两种方式: 传值调用(call-by-value):先计算参数表达式的值,再应用到函数内部; 传名调用(call-by-name):将未计算的参数表达式直接应用到函数内部 在进入函数内部前,传值调用方式就已经将参数表达式的值计算完毕,而传名调用是在函数内部进行参数表达式的值计算的。 这就造成了一种现象,每

  • 我想连接PHP到Oracle数据库12c,我已经尝试在这个视频https://www.youtube.com/watch?v=KJme5JMxKeo > 安装oracle数据库12c:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 解压并粘贴即时客户端(版本12.1.0.2.0)h

  • 我目前正在研究可变参数模板,作为消化我一直在阅读的一些内容的一个小练习,我编写了一个小函数来输出其所有参数类型的名称: 令我惊讶的是,这是使用VC 12.0编译的,并且(似乎)工作得很好。 当只剩下一个参数时,由于重载之间的不确定性,我预计会出现错误,因为我了解到模板参数包可以为空/包含0个参数。 所以我的问题是为什么这行得通?“潜在的歧义”是如何解决的?两个函数的签名不是都只有一个参数吗?我觉得

  • $this->db->call_function(); 这个方法用于执行一些 CodeIgniter 中没有定义的 PHP 数据库函数,而且 使用了一种平台独立的方式。举个例子,假设你要调用 mysql_get_client_info() 函数,这个函数 CodeIgniter 并不是原生支持的,你可以这样做: $this->db->call_function('get_client_info')