2015-02-26 7 views
8

akzeptiert Ich habe ein Hash wie diese hash = {"band" => "for King & Country", "song_name" => "Matter"} und eine Klasse:Pass Hash auf eine Funktion, die Keyword-Argumente

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

Ich würde die hash als Keyword-Argumente wie Song.new band: "for King & Country", song_name: "Matter" übergeben wollen Ist es möglich?

+0

Sie haben symbolische Schlüssel zu verwenden, dh 'hash = {Band:„für King & Country ", song_name:" Matter "}'. – Stefan

+0

@Stefan Ich bekomme den 'Hash' von' .yml' Datei und das ist was es zurückgibt. – mariya

+0

Ist die YAML-Datei repariert oder können Sie sie ändern? – Stefan

Antwort

10

Sie haben die Schlüssel in der Hash-Symbole konvertieren:

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/Aktive Unterstützung gibt es Hash#symbolize_keys