Search code examples
rubyhashkeyword-argument

Pass hash to a function that accepts keyword arguments


I have a hash like this hash = {"band" => "for King & Country", "song_name" => "Matter"} and a class:

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

I would want to pass the hash as keyword arguments like Song.new band: "for King & Country", song_name: "Matter" Is it possible?


Solution

  • You have to convert the keys in your hash to symbols:

    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 / Active Support there is Hash#symbolize_keys