gpt4 book ai didi

ruby 访问修饰符,不同版本 2.5 - 2.7 的不同输出

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

我正在尝试运行此代码,它会针对不同版本的 ruby​​ 2.5 - 2.7 提供不同的输出

代码:

class ParentClass
def the_public_method
self.method1
end

private

def method1
puts "The private has been called"
end
end

class ChildClass < ParentClass
def test
self.method1
end
end

ParentClass.new.the_public_method
ChildClass.new.test

ruby 2.5 上它给出:

Traceback (most recent call last):
1: from main.rb:19:in `<main>'
main.rb:3:in `the_public_method': private method `method1' called for
#<ParentClass:0x000056367ee0b388> (NoMethodError)
Did you mean? method
methods
exit status 1

ruby 2.7 上它给出:

The private has been called
The private has been called

我认为第一个输出对于旧版本的 ruby​​ 是正确的..有任何反馈吗?

最佳答案

I think the first output is correct with the older version of ruby.. any feedback?

两个输出都是正确的。 Ruby 2.7 中的规范发生了变化,因此 Ruby 2.7 的行为自然会有所不同。

最初,私有(private)方法的规则是“私有(private)方法只能在没有显式接收者的情况下调用”。

但是,这意味着您不能使用私有(private) setter,因为 foo = :bar 是局部变量赋值,而 self.foo = :bar 是不允许的.

因此,规则更改为“私有(private)方法只能在没有显式接收者的情况下调用,setter 除外,其中文字伪变量 self 允许作为接收者”。

但是,这仍然没有考虑 self + 2self.foo += 2 之类的事情,其中​​ +foofoo= 是私有(private)的,还有许多其他极端情况。

有一段时间,Ruby 开发人员试图通过忽略某些极端情况或添加更复杂的异常集来解决这个问题,但实际上,解决方案相当简单:将规则更改为“私有(private)方法”只能用文字伪变量 self 作为显式或隐式接收者调用。

这是自 Ruby 2.7 以来的规则。

关于ruby 访问修饰符,不同版本 2.5 - 2.7 的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66741863/

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