2011-01-17 12 views
13

Ich mag diesesWie eine rubin ganze Zahl in ein Symbol

q_id = [1,2,3,4,5,...,100] 

Ich möchte ein Ruby-Array konvertieren durch das Array zu durchlaufen und wie diese in einen Hash konvertieren

{ 
    :1 => { #some hash} , 
    :2 => { #another hash}, 
    ... 
    :100 => {#yet another hash} 
} 

Was das ist kürzeste und eleganteste Art, dies zu erreichen?

[BEARBEITEN: die to_s.to_sym während handy ist nicht, wie ich es will. Entschuldigt es nicht früher zu erwähnen]

+0

Ich glaube nicht, dass das legal ist. Versuchen Sie '' 1' in 'irb' einzugeben und Sie erhalten einen Syntaxfehler. – detunized

+0

Wie unten erwähnt: 1 ist nicht gültig. Das Beste, was du bekommen kannst, ist: "1". Ich bin mir nicht sicher, warum das so wichtig ist, da die Zitate nicht wirklich "Teil" des Symbols sind. Aber es muss für Parsing-/Grammatik-Gründe definiert werden. –

+3

Vielleicht sollten Sie uns zeigen, was Sie wirklich erreichen wollen. Warum hast du das Gefühl, dass du Zahlen als Symbole für die Schlüssel deines Hash brauchst? Wie werden Sie später den Hash indexieren, oder wenn Sie ihn iterieren, was werden Sie mit den Schlüsseln tun? – Phrogz

Antwort

26

für ein Symbol zu schaffen, entweder dieser Arbeit:

42.to_s.to_sym 
:"#{42}" 

Die #inspect Darstellung dieser zeigt :"42" nur weil :42 ist kein gültiges Symbol wörtlich zu nehmen. Seien Sie versichert, dass die doppelten Anführungszeichen nicht Teil des Symbols selbst sind.

Um einen Hash zu erstellen, gibt es jedoch keinen Grund, die Schlüssel in Symbole zu konvertieren. Sie sollten dies einfach tun:

q_id = (1..100).to_a 
my_hash_indexed_by_value = {} 
q_id.each{ |val| my_hash_indexed_by_value[val] = {} } 

Oder diese:

my_hash = Hash[ *q_id.map{ |v| [v,{}] }.flatten ] 

Oder diese:

# Every time a previously-absent key is indexed, assign and return a new hash 
my_hash = Hash.new{ |h,val| h[val] = {} } 

Mit dieser alles, was Sie können dann indizieren Ihre Hash direkt mit einer ganzen Zahl und erhalten eindeutiger Hash zurück, z

my_hash[42][:foo] = "bar" 

Im Gegensatz zu JavaScript, wo jeder Schlüssel zu einem Objekt ein String sein muss, Hashes in Ruby akzeptiert jedes Objekt als Schlüssel.

+0

Danke für die ausführliche Erklärung !! – papdel

+1

':" 42 "' funktioniert genauso gut wie '' # {42} '' –

+0

@AndrewGrimm gut, ja; Ich nahm an, dass anstelle von "42" eine Variable verwendet würde, aber ich nehme an, dass das für Neulinge vielleicht nicht klar ist. Danke fürs klarstellen. – Phrogz

0

u 1.to_s.to_sym

verwenden kann, aber dies wird Symbole machen wie:. "1"

+0

siehe obigen Kommentar – papdel

3

Um eine ganze Zahl in ein Symbol zu übersetzen, verwenden to_s.to_sym. Beispiel:

1.to_s.to_sym

Beachten Sie, dass ein Symbol mehr eine Zeichenfolge als eine Ganzzahl verwandt ist. Es ist möglicherweise nicht so nützlich für Dinge wie Sortieren.

+0

Es wird ':" 1 "' '' 1'. – detunized

+0

Richtig, ich fügte eine Klarstellung hinzu. Danke, dass du es aufgezeigt hast. –

+0

Ja, wie Andy erwähnt hat, ich suche einen Weg, um es zu konvertieren: 1 und nicht: "1". Direkte to_sym-Methode ist bereits ausgeschlossen – papdel

1

Wie bereits erwähnt: 1 ist kein gültiges Symbol. Hier ist eine Möglichkeit zu tun, was Sie wollen, aber mit den Tasten als Strings:

Hash[a.collect{|n| [n.to_s, {}] }] 
1

Ein Array der Objekte, die Sie in Ihrem Hash wollen wäre so viel einfacher zu bedienen, wäre es nicht? Selbst ein Hash von ganzen Zahlen würde ziemlich gut funktionieren, oder?

0

Eigentlich sind "Symbolnummern" keine Sache in Ruby (versuchen Sie, die to_sym Methode auf eine Nummer aufzurufen). Der Vorteil der Verwendung von Symbolen in einem Hash liegt in der Leistung, da sie immer dieselbe object_id haben (versuchen Sie, object_id auf Strings, booleans, Zahlen und Symbolen aufzurufen).

Zahlen sind unmittelbare Werte und haben wie Symbolobjekte immer die selbe object_id.

Wie dem auch sei, die neue Hash-Syntax impliziert Symbole als Schlüssel verwenden, aber man kann immer die gute alte "hash Rakete" Syntax

awesome_hash = { 1 => "hello", 2 => "my friend" }

Lesen Sie mehr über unmittelbare Werte hier verwenden:

https://books.google.de/books?id=jcUbTcr5XWwC&pg=PA73&lpg=PA73&dq=immediate+values+singleton+method&source=bl&ots=fIFlAe8xjy&sig=j7WgTA1Cft0WrHwq40YdTA50wk0&hl=en&sa=X&ei=0kHSUKCVB-bW0gHRxoHQAg&redir_esc=y#v=onepage&q&f=false

Verwandte Themen