gpt4 book ai didi

scala - 为什么编译器不在封闭类中查找方法?

转载 作者:行者123 更新时间:2023-12-04 17:27:50 25 4
gpt4 key购买 nike

看看下面的 Scala 示例:

class A {
def foo(x: Int): Int = x

private class B {
def foo(): Int = foo(3)
}
}

编译器在尝试编译时产生错误消息:
A.scala:5: error: too many arguments for method foo: ()Int
def foo(): Int = foo(3)
^

出于某种原因,编译器没有查看封闭类 A找到要调用的方法。它只在类里面看起来 B , 找到 foo那里的方法不接受不适合的参数然后放弃。如果我重命名这些方法,则它可以正常工作:
class A {
def bar(x: Int): Int = x

private class B {
def foo(): Int = bar(3)
}
}

在这种情况下,编译器确实在类 A 中查找并找到 bar方法在那里。

为什么第一个例子不起作用;这是根据 Scala 的规范,还是编译器错误?如果这是按照规则,那为什么规则是这样的?

顺便说一下,另一种解决问题的方法是使用 self 类型注释:
class A {
self =>

def foo(x: Int): Int = x

private class B {
def foo(): Int = self.foo(3)
}
}

最佳答案

从技术上讲,B 类是一个块。您可以将问题简化为以下几点:

def foo(x: Int): Int = x;
{
def foo(): Int = foo(3)
}

那会导致完全相同的问题。它符合规范,因为块中引入的所有名称都会隐藏任何具有相同名称的内容(忽略签名,请参阅 spec 的第 2 章)。重载只能在类级别上进行。 ( spec中的第6.26.3章)

关于scala - 为什么编译器不在封闭类中查找方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248203/

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