gpt4 book ai didi

Scala 模糊性与无括号函数调用

转载 作者:行者123 更新时间:2023-12-01 05:03:02 25 4
gpt4 key购买 nike

请原谅长时间的设置。这个问题与 Scala: ambiguous reference to overloaded definition - best disambiguation? 相关,但没有得到回答。

我对 Scala 很陌生,让我失望的一件事是 Scala 两者:

  • 具有一流的功能
  • 使用没有任何括号参数列表的对象点表示法时调用函数(就好像函数是一个属性)

  • 这两种语言特性让我感到困惑。看下面的代码:

    我的类(class){
    def something(in: String): String = {
    在 + "_X"
    }

    定义一些东西:字符串 => 字符串 = {
    案例_ =>“固定”
    }
    }

    val my = new MyClass()

    println(List("foo", "bar").map(my.something))

    我希望通过调用与 List("foo_X", "bar_X") 所需的 something 参数匹配的 map 原型(prototype)来打印 String => ? 。相反,输出是 List("Fixed", "Fixed") - Scala 2.11 调用无参数 something() ,然后将其返回值传递给 map

    如果我们注释掉 something 的第二个无参数原型(prototype),输出将变为预期结果,证明另一个原型(prototype)在上下文中是有效的。

    将空参数列表添加到第二个原型(prototype)(使其成为 def something() )也会改变行为。

    my.something 更改为 my.something(_) 将 Scala 唤醒到它之前默默忽略的歧义:

    错误:对重载定义的模糊引用,
    两种方法都属于 MyClass 类型的方法 => String => String
    和方法类 MyClass 类型的东西(in:String)String
    匹配参数类型(字符串)
    println(List("foo", "bar").map(my.something(_)))

    即使使用据说是为此目的的魔术尾随下划线也不起作用:

    val myFun: (String) => String = my.something _

    这导致:

    错误:类型不匹配;
    发现:()=>字符串=>字符串
    必需:字符串 => 字符串
    val myFun: (String) => String = my.something _

    我的问题:
  • 如果我的 MyClass 完全按照所写(原型(prototype)没有更改,尤其是没有向其中一个原型(prototype)添加空参数列表),我如何明确地告诉 Scala 我希望 something 的第一个单参数版本通过作为另一个电话的参数?
  • 既然显然有两个令人满意的参数可以传递给 map ,为什么 Scala 编译器没有将歧义报告为错误?
  • 有没有办法禁用 Scala 的行为(有时,并非总是)将 foo.bar 视为等同于 foo.bar()
  • 最佳答案

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

    关于Scala 模糊性与无括号函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31371644/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com