gpt4 book ai didi

ruby - 当父类的方法访问子类的常量时怪癖

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:20 25 4
gpt4 key购买 nike

给定以下代码:

class Parent
CONSTANT = "Parent"

def self.do_the_thing
puts CONSTANT
puts self::CONSTANT
end
end

class Child < Parent
CONSTANT = "Child"
end

下面的方法调用:

puts Parent.do_the_thing
# Parent
# Parent

puts Child.do_the_thing
# Parent
# Child

为什么 Child.do_the_thing 不打印两次“Child”?

最佳答案

常量查找算法可以简化为:

  1. 词汇上的“向外”
  2. 继承“向上”

因此,它首先尝试在最接近的词法封闭模块/类定义中找到常量,然后是该模块定义的词法封闭模块定义,依此类推。如果它在那里找不到常量,然后并且只有这样它会查看继承链。

我不认为 matz 曾经为这个算法提供过正式的证明,但这个算法类似于 Newspeak 中的方法解析算法,Gilad Bracha 提供了以下证明:如果你写了一个方法,并且你有在词法封闭上下文中就在你面前的一个值,如果它从系统的完全不同的部分获取一些其他值,那将是令人惊讶的。

翻译成你的例子:CONSTANT赋值实际上直接在方法定义之上,如果该方法的作者没有在他眼前获取正在赋值的值,那将是令人惊讶的。

self::CONSTANT在这种情况下,您可以通过使用 :: 显式指定查找的起点来跳过词法查找部分。范围解析运算符。

注意:不幸的是,持续查找实际上那么简单。可悲的是,我不知道有什么好的描述。在她著名的"Three Implicit Contexts"文章中,yugui 写道她没时间了,会在以后的文章中解释不断查找,但不幸的是,她从来没有这样做。

关于ruby - 当父类的方法访问子类的常量时怪癖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42779998/

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