Как работает этот аксессуар Ruby Custom
-
14-10-2019 - |
Вопрос
Таким образом, метод ниже в Class_eval Dynamicaly создает аксессов для атрибутов, определенных во время выполнения. Например, его можно использовать для создания объектов конфигурации с помощью атрибутов, считываемых из файла конфигурации (и неизвестно до среды выполнения). Я понимаю все это, кроме как ветвь. Если я прав, то ветвь else возвращает значение атрибута (val [0]), если в *val, переданное в *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
Решение
Равный знак не является аргументом для метода, это часть имени метода. На самом деле вы можете позвонить в задание как это:
value=(5)
Таким образом, только целое число 5 является аргументом для функции
*Обновлять
class Module
def dsl_accessor(*symbols)
symbols.each do |sym|
class_eval %{
def #{sym}
@#{sym}
end
def #{sym}=(val)
@#{sym} = val
end
}
end
end
end