2015-02-26 20 views
8

ho un hash come questo hash = {"band" => "for King & Country", "song_name" => "Matter"} e una classe:Passo hash ad una funzione che accetta argomenti chiave

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

vorrei passare gli hash argomenti come parole chiave come Song.new band: "for King & Country", song_name: "Matter" E 'possibile?

+0

Devi usare chiavi simboliche, cioè 'hash = {banda: "per King & Country ", song_name:" Materia "}'. – Stefan

+0

@Stefan Ottengo il 'hash' dal file' .yml' e questo è ciò che restituisce. – mariya

+0

Il file YAML è stato riparato o è possibile modificarlo? – Stefan

risposta

10

è necessario convertire le chiavi nel vostro hash simboli:

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"} 

In Rails/Supporto Active c'è Hash#symbolize_keys