Таким образом, метод ниже в class_eval динамически создает методы доступа для атрибутов, определенных во время выполнения. Его можно использовать, например, для создания объектов конфигурации с атрибутами, считанными из файла конфигурации (и неизвестными до времени выполнения). Я все это понимаю, кроме ветки else. Если я прав, ветвь else возвращает значение атрибута (val [0]), если в * val передано одно значение. Однако, как написано, я ожидал, что он вернет массив (val), если в * var передано более одного значения. В частности, если у меня есть что-то вроде следующего:
value = 5
тогда от чтения кода я бы ожидал @value to be [=,5]
. Однако @value
возвращает 5, а не массив [=, 5]. Как это возможно?
class Module
def dsl_accessor(*symbols)
symbols.each do |sym|
class_eval %{
def #{sym}(*val)
if val.empty?
@#{sym}
else
@#{sym} = val.size == 1 ? val[0] : val
end
end
}
end
end
end