2012-03-17 3 views
2

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

class SomeClass 
    attr_accessor :hello, :holla 
    def initialize (hash = { hello: 'world', holla: 'mundo'}) 
    @hello = hash[:hello] 
    @else = hash[:holla] 
end 
end 

, который работает по желанию, если не следует вводить какое-либо аргумент

p = SomClass.new 
puts "should be 'world'" 
puts p.hello 
puts "should be 'mundo'" 
puts p.holla 

$ruby hello_world.rb 
should be 'world' 
universe 
should be 'mundo' 
mundo 

, но если один из дополняющая хеша установлен другой остается пустым, например:

p = SomeClass.new({ hello: 'universe'}) 
puts "should be 'universe'" 
puts p.hello 
puts "should be 'mundo'" 
puts p.holla 

$ruby hello_world.rb 
should be 'universe' 
universe 
should be 'mundo' 

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

ответ

5

Нет никакого способа сделать это без специального кода. Простейший вариант, который был бы:

def initialize(hash = {}) 
    hash = {hello: "world", holla: "mondo"}.merge(hash) 
    # now your default values are set, but will be overridden by the passed argument 
end 

Это позволит дополнительные свойства, которые передаются в хеш, но я предполагаю, что это желательно, так как вы сознательно использовали расширяемый вход, чтобы начать с.

Смежные вопросы