Ruby数组上未定义的方法'to_h'

Wan*_*ker 13 ruby arrays hash ruby-2.0

根据Ruby Array文档,to_h只要数组的每个元素是另外两个元素的数组,就有一种方法可用于将数组转换为哈希.以下示例来自相同的文档

p [[:foo, :bar], [1, 2]].to_h
Run Code Online (Sandbox Code Playgroud)

但是,当我运行上面的代码时,我收到此错误:

irb(main):001:0> p [[:foo, :bar], [1, 2]].to_h
NoMethodError: undefined method `to_h' for [[:foo, :bar], [1, 2]]:Array
        from (irb):1
        from E:/RubyInstall/bin/irb:12:in `<main>'
irb(main):002:0>
Run Code Online (Sandbox Code Playgroud)

我的Ruby版本是

C:\>ruby -v
ruby 2.0.0p247 (2013-06-27) [x64-mingw32]
Run Code Online (Sandbox Code Playgroud)

我想用这种技术来回答关于Stackoverflow的另一个问题,但我现在卡住了,因为Ruby的文档功能对我不起作用.

Ric*_*ton 10

to_h方法仅适用于Ruby 2.1或更高版本.

请查看此处的发行说明

http://pivotallabs.com/ruby-2-1-0-changes-of-note/


Dat*_*att 7

是的,它不支持低于Ruby 2.1的版本,如果你正在寻找替代品.试试这个

keys = [:foo, :bar]
vals = [1, 2]
Hash[*keys.zip(vals).flatten]
 => {:foo=>1, :bar=>2}
Run Code Online (Sandbox Code Playgroud)


Reg*_*ieB 6

下面的代码将使用补丁数组并提供一个to_h方法,使用@ engineersmnky注释中的代码,如果to_h尚未定义 - 也就是说,在2.1之前的ruby环境中.

unless [].respond_to? :to_h
  class Array
    def to_h
      Hash[self]
    end
  end
end
Run Code Online (Sandbox Code Playgroud)