我希望为方法命名参数,以便调用者明白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
这很有效,但是我必须在很多地方做这个,我宁愿有一些帮助器动态地将命名参数转换为哈希值。我找不到办法做到这一点。有关如何实现这一点的任何想法?
答案 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)
您必须在:
之间进行选择使用关键字参数(如您所示)并分别从这些值创建哈希值, OR ...
使用具有默认值的哈希参数,例如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}