Ruby 未定义的方法“assoc';对于#<;散列:0x10f591518>;(命名者)
我试图根据本地环境中定义的散列返回一个基于用户定义参数的值列表Ruby 未定义的方法“assoc';对于#<;散列:0x10f591518>;(命名者),ruby,hash,enumerable,Ruby,Hash,Enumerable,我试图根据本地环境中定义的散列返回一个基于用户定义参数的值列表 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"],"
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)
我猜您是从其他语言来学习Ruby的,因为这种方法有很多不必要的缺点。此外,由于各种原因,它不会返回您期望的结果
`accumulator = Hash.new(0)`
这是不必要的,因为(1)您希望返回一个数组,(2)您不需要在ruby中预先初始化变量
Hash[…]
语法在此上下文中是非常规的,通常用于将其他一些可枚举(通常是数组)转换为哈希,如Hash[1,2,3,4]#=>{1=>2,3=>4}
中所述。定义散列时,只需使用花括号{…}
对于
args
的每次迭代,您都将累加器分配给哈希查找的结果,而不是累加值(根据示例输出,这是您需要做的)。相反,您应该看看各种数组连接方法,比如push
,+=
,什么版本的Ruby<代码>哈希#assoc
添加到Ruby 1.9中。它在Ruby 1.8.1.9.3中不可用,很抱歉我错过了assoc可能在另一个由控制台irb加载的gem中,但在运行脚本时不可用。它是一个标准的哈希方法,应该是内置的
`accumulator = Hash.new(0)`
def my_method(*args)
foo = { "key1"=>["var1","var2"],"key2"=>["var3","var4","var5"] }
bar = { "key3"=>["var6"],"key4"=>["var7","var8","var9"],"key5"=>["var10","var11","var12"] }
baz = { "key6"=>["var13","var14","var15","var16"] }
merged = [foo, bar, baz].reverse.inject({}, :merge)
args.inject([]) do |array, key|
array += Array(merged[key])
end
end