Почему метод базового класса вызывается внутри унаследованного? - PullRequest
2 голосов
/ 05 июня 2019

В 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

output:

1428955046062147697
a
1428955046062147697
b

1 Ответ

3 голосов
/ 05 июня 2019

Никакой магии здесь.

Когда вы объявляете B, все происходит в следующем порядке (грубо говоря):

  1. B (экземпляр Class) (который наследует все от A).На данный момент у него нет ничего конкретного.

  2. A.inherited hook вызывается.

  3. B класс открывается и обрабатывается,Только в этот момент он получает свои собственные свойства и методы (кроме тех, которые могут быть созданы внутри хука).

Итак, когда (2) происходит единственное name, котороедоступно для B, определено в A.

Это очень легко проверить с помощью следующего кода:

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

Теперь все ясно, верно?

...