2015-07-28 12 views
8

Come da Ruby Array documentation, esiste un metodo to_h che può essere utilizzato per convertire gli array in hash purché ogni elemento dell'array sia un altro array di due elementi. Esempio di sotto della stessa documentazioneMetodo non definito 'to_h' su matrice Ruby

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

Tuttavia, quando si esegue il codice di cui sopra, ottengo questo errore:

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> 

La mia versione di Ruby è

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

ho voluto usare questo tecnica per rispondere a un'altra domanda su Stackoverflow, ma ora sono bloccato perché una funzionalità documentata di Ruby non funziona per me.

+0

@ Зелёный Grazie –

+2

Come nota è comunque possibile utilizzare la compatibilità 'Hash :: []' sintassi del tipo 'Hash [[[: foo,: bar], [1, 2]]]' per produrre lo stesso risultato in Ruby <2.1 – engineersmnky

+0

@engineersmnky Sembra fantastico! –

risposta

1

Rubino 2.0 non supporta to_h metodo. è disponibile in 2.1 e superiore

7

Sì, non è supportato per versioni inferiori a Ruby 2.1, Se si sta cercando un'alternativa. Prova questo

keys = [:foo, :bar] 
vals = [1, 2] 
Hash[*keys.zip(vals).flatten] 
=> {:foo=>1, :bar=>2} 
+0

Vale la pena notare che nella documentazione di Ruby 2.1.0 'a_h',' [[: foo,: bar], [1, 2]]. A_h' dovrebbe risultare in '{: foo =>: bar, 1 => 2} 'https://ruby-doc.org/core-2.1.0/Array.html#method-i-to_h – ReggieB

2

il seguente codice di patch scimmia Array e fornire un metodo to_h utilizzando il codice cedere @ di engineersmnky commento, se to_h non è già definito - vale a dire, in-2.1 pre ambienti rubino.

unless [].respond_to? :to_h 
    class Array 
    def to_h 
     Hash[self] 
    end 
    end 
end