gpt4 book ai didi

ruby - 为什么在继承内部调用基类方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:42:26 30 4
gpt4 key购买 nike

在基类的self.inherited方法中,传递子类,调用子类的name方法,而不是调用基类方法。虽然同样的事情有效如果在其他地方的同一个类上调用相同的方法

class A
def self.name
"a"
end

def self.inherited(subclass)
puts B.hash
puts B.name
end
end

class B < A
def self.name
"b"
end
end

puts B.hash
puts B.name

输出:

1428955046062147697
a
1428955046062147697
b

最佳答案

这里没有魔法。

当您声明 B 时,事情按以下顺序发生(粗略地说):

  1. B(Class 的实例)已创建(它继承了 A 的所有内容)。目前它没有任何具体内容。

  2. A.inherited 钩子(Hook)被调用。

  3. B 类被打开并处理。只有在这一点上,它才会获得自己的属性和方法(除了那些可以在钩子(Hook)内部创建的)。

因此,当 (2) 发生时,B 可用的唯一 nameA 中定义的那个。

使用以下代码很容易检查:

class A
def self.name
"a"
end

def self.inherited(subclass)
puts "B own methods, point 1: #{subclass.methods(false).join(', ')}"
end
end

class B < A
puts "B own methods, point 2: #{self.methods(false).join(', ')}"

def self.name
"b"
end

puts "B own methods, point 3: #{self.methods(false).join(', ')}"
end

# B own methods, point 1:
# B own methods, point 2:
# B own methods, point 3: name

现在一切都清楚了,对吧?

关于ruby - 为什么在继承内部调用基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56466898/

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