加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala模糊与无人函数调用

发布时间:2020-12-16 08:44:37 所属栏目:安全 来源:网络整理
导读:请原谅长时间的设置.这个问题与 Scala: ambiguous reference to overloaded definition – best disambiguation?有关,但没有回答. 我对Scala很陌生,有一件让我失望的事情就是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))

我希望通过调用匹配地图所需的String =>的原型来打印List(“foo_X”,“bar_X”). ?论点.相反,输出是List(“Fixed”,“Fixed”) – Scala 2.11调用无参数something()然后将其返回值传递给地图.

如果我们注释掉某个东西的第二个无参数原型,那么输出就会变成预期的结果,证明另一个原型在上下文中是有效的.

将空参数列表添加到第二个原型(使其定义为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我希望第一个单参数版本的东西通过作为另一个电话的参数?
>由于显然有两个令人满意的参数可以传递给map,为什么Scala编译器不会将歧义报告为错误?
>有没有办法禁用Scala的行为(有时,并非总是)将foo.bar视为等同于foo.bar()?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读