2015-02-26 4 views
8

У меня есть хэш, как этот hash = {"band" => "for King & Country", "song_name" => "Matter"} и класс:Pass хэш-функции, которая принимает ключевые аргументы

class Song 
    def initialize(*args, **kwargs) 
    #accept either just args or just kwargs 
    #initialize @band, @song_name 
    end 
end 

Я хотел бы передать hash в качестве ключевого слова аргументы как Song.new band: "for King & Country", song_name: "Matter" возможно ли это?

+0

Вы должны использовать символические ключи, то есть 'хэш = {группа:«для King & Country ", song_name:" Matter "}'. – Stefan

+0

@Stefan Я получаю 'хэш' из' .yml' файла, и это то, что он возвращает. – mariya

+0

Является ли файл YAML исправленным или вы можете его изменить? – Stefan

ответ

10

Вы должны преобразовать ключи в хэш-символам:

class Song 
    def initialize(*args, **kwargs) 
    puts "args = #{args.inspect}" 
    puts "kwargs = #{kwargs.inspect}" 
    end 
end 

hash = {"band" => "for King & Country", "song_name" => "Matter"} 

Song.new(hash) 
# Output: 
# args = [{"band"=>"for King & Country", "song_name"=>"Matter"}] 
# kwargs = {} 

symbolic_hash = hash.map { |k, v| [k.to_sym, v] }.to_h 
#=> {:band=>"for King & Country", :song_name=>"Matter"} 

Song.new(symbolic_hash) 
# Output: 
# args = [] 
# kwargs = {:band=>"for King & Country", :song_name=>"Matter"} 

В Rails/Active Support, есть Hash#symbolize_keys

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