У меня есть класс, который содержит некоторые личные атрибуты. То, что я хотел бы сделать, это динамически добавлять некоторые сеттеры для них только для выполнения определенного блока.
Пример того, что я хотел бы иметь:
class Content
attr_reader :a, :b
def initialize
@a = 1
@b = "plop"
end
def set(&block)
extend(Setter)
instance_eval(&block)
unextend(Setter) ????
end
module Setter
def a(value)
@a = value
end
def b(value)
@b = value
end
end
end
content = Content.new
content.set do
a 2
b "yeah!"
end
content.a # should return 2
РЕДАКТИРОВАТЬ : Спасибо за отличные ответы до сих пор. Я прояснил вопрос, потому что на самом деле мне нужно определить средства чтения атрибутов в самом классе, которые могут конфликтовать с установщиками, определенными в модуле. Я забыл об этой части при публикации вопроса. (Было уже поздно ^^)
ПОЯСНЕНИЕ : Этот класс предназначен для DSL для записи файла конфигурации. Он ориентирован на не разработчиков, поэтому чем меньше операторов, тем лучше.
В настоящее время я реализую это, используя прокси-класс, который instance_eval
блок, но мне нужно связываться с instance_variable_set
, чтобы установить значения, и мне это не нравится. Я просто пытаюсь найти способ сделать мой код более читабельным.