Неопределенный метод to_h для массива Ruby

Согласно документации Ruby Array, существует метод to_h, который можно использовать для преобразования массивов в хэш, если каждый элемент массива является другим массивом из двух элементов. Пример ниже из той же документации

p [[:foo, :bar], [1, 2]].to_h

Однако, когда я запускаю приведенный выше код, я получаю эту ошибку:

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>

Моя версия Руби

C:\>ruby -v
ruby 2.0.0p247 (2013-06-27) [x64-mingw32]

Я хотел использовать эту технику, чтобы ответить на другой вопрос о Stackoverflow, но теперь я застрял, поскольку документированная функция Ruby у меня не работает.


person Wand Maker    schedule 28.07.2015    source источник
comment
В качестве примечания вы все еще можете использовать совместимый синтаксис Hash::[], такой как Hash[[[:foo, :bar], [1, 2]]], для получения того же результата в Ruby ‹ 2.1.   -  person engineersmnky    schedule 28.07.2015
comment
@engineersmnky Звучит потрясающе!   -  person Wand Maker    schedule 28.07.2015
comment
Вы должны обновиться как минимум до версии 2.1. 2.0 были некоторые проблемы (например, Refinements).   -  person Cary Swoveland    schedule 28.07.2015
comment
@CarySwoveland Конечно, подойдет   -  person Wand Maker    schedule 28.07.2015


Ответы (4)


Метод to_h доступен только в Ruby версии 2.1 или выше.

Ознакомьтесь с примечаниями к выпуску здесь

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

person Richard Hamilton    schedule 28.07.2015
comment
Спасибо. Обновлю свой Рубин. :-) - person Wand Maker; 28.07.2015

Да, он не поддерживается для более ранней версии, чем Ruby 2.1, если вы ищете альтернативу. Попробуй это

keys = [:foo, :bar]
vals = [1, 2]
Hash[*keys.zip(vals).flatten]
 => {:foo=>1, :bar=>2}
person Datt    schedule 28.07.2015
comment
Стоит отметить, что в документации Ruby 2.1.0 to_h [[:foo, :bar], [1, 2]].to_h должно привести к {:foo => :bar, 1 => 2} ruby-doc.org/core-2.1.0/Array.html#method-i-to_h - person ReggieB; 13.03.2017

Следующий код исправит Array и предоставит метод to_h, используя код, указанный в комментарии @engineersmnky, если to_h еще не определен, то есть в средах ruby ​​до версии 2.1.

unless [].respond_to? :to_h
  class Array
    def to_h
      Hash[self]
    end
  end
end
person ReggieB    schedule 13.03.2017

Ruby 2.0 не поддерживает метод to_h. он доступен в версии 2.1 и выше

person Vishnu Atrai    schedule 28.07.2015