Вопрос

Таким образом, метод ниже в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top