在基类的Input: (1, "day")
Output: 1440
方法中,传递了子类,而是调用子类的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
答案 0 :(得分:3)
这里没有魔术。
当您声明B
时,事情会按以下顺序发生(大致而言):
B
(Class
的实例)(它继承了A
的所有内容)。目前还没有任何具体内容。
A.inherited
挂钩被调用。
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
现在一切都清楚了,对吧?