Можно ли добавить методы класса к некоторым экземплярам объектов Ruby, но не к другим?
Вот модуль, содержащий несколько методов:
module M
def x; y; end
def y; ...; end
end
Вот класс:
class C
def z; ...; end
end
У меня есть два случая C
:
c1 = C.new
c2 = C.new
Есть ли что-то, что я могу сделать, чтобы c1
такой, что c1.class
имеет x
а также y
, но c2.class
не делает? Я не вижу простой способ подорвать поиск метода.
3 ответа
Решение
Вы могли бы переопределить c1.class
вернуть что-то, отличное от C (и эта другая вещь будет расширять M). Кроме этого нет.
Обратите внимание, что переопределение c1.class
почти наверняка плохая идея. Объект не должен лгать о том, что его класс.
Вместо того, чтобы делать c1.class.x
почему бы не сделать c1.x
как сказал бы закон Деметры?
class C
def self.x
"hi"
end
end
c1 = C.new
c2 = C.new
def c1.x
self.class.x
end
c1.x # => "hi"
c2.x # NoMethodError
Может быть, это
c1.extend(M)
c1.methods & [:x, :y] #=> [:x, :y]
c2.methods & [:x, :y] #=> []