为什么在继承内部调用 base class 方法?

Why base class method is being called inside inherited?

在baseclass的self.inherited方法中,传递subclass,调用subclass的name方法,而不是调用baseclass 方法。虽然同样的事情有效如果在其他地方

的相同class上调用相同的方法
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. BClass 的实例)被创建(它继承了 A 的所有内容)。目前它没有任何具体内容。

  2. A.inherited 钩子被调用。

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

因此,当 (2) 发生时,唯一可用于 BnameA 中定义的 name

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

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

现在一切都清楚了吧?