Можно ли добавить методы класса к некоторым экземплярам объектов 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] #=> []
Другие вопросы по тегам