Как работает этот ruby ​​custom accessor - PullRequest
0 голосов
/ 31 декабря 2010

Таким образом, метод ниже в 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

1 Ответ

3 голосов
/ 31 декабря 2010

Знак равенства не является аргументом для метода, это часть имени метода.На самом деле вы можете вызвать присваивание следующим образом:

value=(5)

Таким образом, только целое число 5 является аргументом для функции

* Update

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
...