Разница между экземплярами этих T
классов заключается в алгоритме поиска метода: метод всегда ищется в одноэлементном классе (и его модулях), и только если он здесь не найден, онпоиск в классе .
Это означает, что если мы добавим метод test
к первой реализации класса T
после инициализации, мы получим другой результат, чем когда мы сделаем то же самое для второйреализация класса T
:
# First example
class T
def initialize
self.class.class_eval do
def test
return self.class.object_id
end
end
end
end
t = T.new
class T
def test
'overriden'
end
end
puts t.test # => 'overriden'
class T
def initialize
singleton_class.class_eval do
def test
return self.class.object_id
end
end
end
end
t = T.new
class T
def test
'overriden'
end
end
puts t.test # => 77697390