如何将命名参数输入哈希?

时间:2014-02-24 20:34:26

标签: ruby ruby-2.0 ruby-2.1

我希望为方法命名参数,以便调用者明白API,但该方法的实现需要哈希中的命名参数。所以我有这个:

def my_method(required_param, named_param_1: nil, named_param_2: nil)
  named_params = {
    named_param_1: named_param_1,
    named_param_2: named_param_2
  }

  # do something with the named params
end

这很有效,但是我必须在很多地方做这个,我宁愿有一些帮助器动态地将命名参数转换为哈希值。我找不到办法做到这一点。有关如何实现这一点的任何想法?

3 个答案:

答案 0 :(得分:4)

def my_method(required_param, named_param_1: nil, named_param_2: nil)
  named_params = method(__method__).parameters.each_with_object({}) do |p,h|
      h[p[1]] = eval(p[1].to_s) if p[0] == :key
  end
  p named_params # {:named_param_1=>"hello", :named_param_2=>"world"}

  # do something with the named params
end

my_method( 'foo', named_param_1: 'hello', named_param_2: 'world' )

答案 1 :(得分:1)

Ruby 2.0没有提供从关键字参数中获取Hash的内置方法。

您必须在:

之间进行选择
  1. 使用关键字参数(如您所示)并分别从这些值创建哈希值, OR ...

  2. 使用具有默认值的哈希参数,例如Ruby v1.9.3策略described here

答案 2 :(得分:0)

你可以写下你的方法如下:

def my_method(required_param, named_param_1: nil, named_param_2: nil)
   named_params = Hash[method(__method__).parameters.select do |first,last| 
    [last,eval("#{last}")] if first == :key
  end]
end

my_method(12, named_param_1: 11,named_param_2: 12)
# => {:named_param_1=>11, :named_param_2=>12}