【发布时间】:2013-03-21 14:11:16
【问题描述】:
我正在尝试从本地环境中定义的哈希中返回基于用户定义参数的值列表。
def my_method *args
#initialize accumulator
accumulator = Hash.new(0)
#define hashes in local environment
foo=Hash["key1"=>["var1","var2"],"key2"=>["var3","var4","var5"]]
bar=Hash["key3"=>["var6"],"key4"=>["var7","var8","var9"],"key5"=>["var10","var11","var12"]]
baz=Hash["key6"=>["var13","var14","var15","var16"]]
#iterate over args and build accumulator
args.each do |x|
if foo.has_key?(x)
accumulator=foo.assoc(x)
elsif bar.has_key?(x)
accumulator=bar.assoc(x)
elsif baz.has_key?(x)
accumulator=baz.assoc(x)
else
puts "invalid input"
end
end
#convert accumulator to list, and return value
return accumulator = accumulator.to_a {|k,v| [k].product(v).flatten}
end
用户将调用带有关键字参数的方法,并返回与接收到的每个关键字相关联的值列表的函数。
例如
> my_method(key5,key6,key1)
=> ["var10","var11","var12","var13","var14","var15","var16","var1","var2"]
输出可以是任何顺序。我尝试运行代码时收到以下错误:
undefined method `assoc' for #<Hash:0x10f591518> (NoMethodError)
请你指点我如何解决这个问题?在终端中assoc 的表现完全符合我的预期:
> foo.assoc("key1")
=> ["var1","var2"]
【问题讨论】:
-
什么版本的 Ruby?
Hash#assoc是在 Ruby 1.9 中添加的。它在 Ruby 1.8 中不可用。 -
1.9.3 抱歉我错过了
-
也许 assoc 位于控制台 irb 加载的另一个 gem 中,但在您运行脚本时却没有。
-
这是一个标准的Hash方法,应该是内置的
标签: ruby hash enumerable