2015-02-25 4 views
0

Я строй объекта Ruby, который имеет значение по умолчанию для аргументов в initialize методе:Метод: Проходные аргументы с невыполнением

attr_accessor :one, :two, :three 

def initialize(one: nil, two: nil, three: nil) 
    @one = one 
    @two = two 
    @three = three 
end 

Как вы можете видеть, это не очень DRY, особенно в количестве увеличиваются инициализируемые переменные. В конечном счете, я хотел бы иметь возможность прокручивать каждый из аргументов и назначать переменную экземпляра (некоторая комбинация оператора splat и instance_variable_set?), Но всегда имеет определенный список ожидаемых переменных экземпляра со значениями по умолчанию, если они не определены ,

+1

вы также добавлять attr_reader для этих варов? – Anthony

+0

Да, спасибо за упоминание! Обновленный пример выше! – RedBassett

ответ

4

Обычно, когда для инициализации требуется целая куча аргументов, обычно приводит к использованию хеша опций, а не splat.

с вариантами хеширования вы способны высыхать ваш метод инициализации, установите переменные экземпляра и attr_readers в очень рубинового образом:

class Animal 
    def initialize(opts = {}) 
    options = defaults.merge(opts) 
    options.each do |k, v| 
     instance_variable_set("@#{k}", v) 
     self.class.send(:attr_reader, k) 
    end 
    end 

    private 

    def defaults 
    { 
     type: nil, 
     age: 100, 
     name: "Unknown" 
    } 
    end 
end 

animal = Animal.new(type:'cat', age: 99) 
puts animal 
puts animal.type 
puts animal.age 
puts animal.name 

Выход:

#<Animal:0x007f9773132650> 
cat 
99 
Unknown 
+0

Я на самом деле использовал хэш параметров, но остановился, потому что хотел определить все возможные переменные экземпляра. Я понимаю, однако, что этот вид имеет смысл как способ Ruby сделать это. Однако моя забота пытается получить доступ к переменным, которые не определены при инициализации. Я подхожу к этому неправильно, пытаясь определить значения по умолчанию для всех этих переменных? – RedBassett

+1

Несомненно, это общий прецедент, и я обновил свой ответ, чтобы вы могли его обработать. – Anthony

+0

Yup! Слияние значений по умолчанию, похоже, именно то, что я искал! – RedBassett