У меня есть класс, который содержит некоторые частные атрибуты. То, что я хотел бы сделать, - это динамически добавить некоторые сеттеры для них только для выполнения определенного блока.Расширение только для одного вызова блока
Пример того, что я хотел бы быть в состоянии:
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
EDIT: Спасибо большое за ответы до сих пор. Я уточнил этот вопрос, потому что мне действительно нужно определить читателей атрибутов в самом классе, которые могут противоречить сеттерам, определенным в модуле. Я забыл об этой части при публикации вопроса. (Было поздно ^^)
CLARIFICATION: Этот класс предназначен для DSL для записи конфигурационного файла. Он нацелен на не-разработчика, поэтому чем меньше операторов, тем лучше.
В настоящее время я реализую это с использованием прокси-класса, который instance_eval
блок, но мне нужно общаться с instance_variable_set
, чтобы установить значения, и мне это не нравится. Я просто пытаюсь понять, могу ли я сделать код более читаемым.
Есть ли какая-либо причина вы пишете собственные писатель , вместо использования attr_writer для их создания для вас? – rampion