Мне интересно, каков канонический путь в Ruby для создания пользовательских методов setter и getter. Обычно я делаю это через attr_accessor
, но я в контексте создания DSL. В DSL, сеттера называются так (с помощью =
знака будет создавать локальные переменные):Ruby get и set в одном методе
work do
duration 15
priority 5
end
Таким образом, они должны быть реализованы следующим образом:
def duration(dur)
@duration = dur
end
Однако это делает реализацию геттер A бит сложный: создание метода с тем же именем, но без аргументов просто перезапишет setter.
Так что я написал пользовательские методы, которые делают как садилось, и получение:
def duration(dur=nil)
return @duration = dur if dur
return @duration if @duration
raise AttributeNotDefinedException, "Attribute '#{__method__}' hasn't been set"
end
Это хороший способ пойти об этом? Вот суть с тестами:
Спасибо!
Это может быть «умным», но это довольно известная идиома, поэтому я бы, конечно же, позволил ему перейти в обзор кода. –
Спасибо, это отличные идеи. У меня нет варианта использования для установки значения в ноль, но хорошо знать, как его покрыть. – abbottjam