Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 未定义的方法“assoc';对于#<;散列:0x10f591518>;(命名者)_Ruby_Hash_Enumerable - Fatal编程技术网

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