2017-02-19 2 views
0

Ich versuche im folgenden Beispiel eine Reihe von Elementen aufzurufen.Ruby: Eine Stringvariable zum Aufrufen eines Array-Elementsatzes zu verwenden funktioniert nicht

session_times: { 
    thursday: ["10:20am", "12:30pm", "6:40pm"], 
    friday: ["10:20am", "12:30pm", "6:40pm"], 
    saturday: ["10:20am", "12:30pm", "6:00pm"], 
    sunday: ["10:20am", "12:30pm", "6:30pm"] 
    } 

Ich habe versucht, die folgenden Funktionen zu tun

days_all = movie[:session_times] 
string = ':' + 'thursday' 
var1 = days_all[:thursday] 
var2 = days_all["#{string}"] 
var3 = days_all[string] 

Die Variable var1 kommt völlig in Ordnung, aber ich verstehe nicht, warum var2 oder var 3 nicht mein Ergebnis erhalten, sollte das gleiche mit dem gleichen kommen Variable namens rechts?

Hilfe wäre sehr geschätzt :)

Antwort

3

Nein, es gibt einen Unterschied zwischen Symbol und String und sie sind nicht immer austauschbarer. Ein Symbol ist nicht dasselbe wie eine Zeichenfolge, die mit einem Doppelpunkt beginnt (das ist immer noch eine Zeichenfolge). Wenn Sie die Hash-Syntax key: val verwenden, sind die Schlüssel Symbole; "key" => val wäre ein String-Schlüssel.

eine dieser funktionieren würde:

string = "thursday" # don't put the colon in here 
days_all[:"#{string}"] 
days_all[string.to_sym] 
days_all["#{string}".to_sym] 

Wenn Sie das Juwel activesupport installieren und dann require active_support/all (diese automatisch in Schienen geschieht), dann ist es weniger streng, was Schlüssel Sie verwenden müssen:

days_all = days_all.with_indifferent_access 
days_all["thursday"] 
days_all[:thursday] 
days_all.thursday 
+0

Danke, dass es war :) Sorry für die späte Antwort – vinnym342

1

Mit Ruby :x bezieht sich auf ein Symbol und "x" bezieht sich auf eine Zeichenfolge. Ein Symbol ist eine "internalisierte Zeichenfolge", es verhält sich mehr wie eine beliebige Konstante und jede Instanz von :x ist identisch mit jeder anderen, sie sind buchstäblich das gleiche Objekt.

Das gleiche gilt nicht für Strings, jeder kann unterschiedlich sein und belegt normalerweise einen anderen Speicherbereich. Aus diesem Grund sehen Sie Symbole, die für Keys in Hashes verwendet werden, ansonsten wäre ihre Wiederholung verschwenderisch.

Sie können Ihre Struktur eine der folgenden Methoden zugreifen:

days_all[:thursday] # With a plain symbol 
days_all["thursday".to_sym] # With a converted string 
days_all[:"thursday"] # With a long-form symbol 

andere Sache zu beachten ist, werden Sie wahrscheinlich mit dieser Datenstruktur haften möchten nicht, wenn Sie es vermeiden können. Dies ist nicht sehr "maschinenlesbar", Namen wie :thursday sind völlig willkürlich. Es ist viel besser, einen konsistenten Index wie 0 zu verwenden, der Sonntag, 1 bedeutet, Montag und so weiter bedeutet. Auf diese Weise können Funktionen wie cwday verwendet werden, um Dinge in einem regulären Array nachzuschlagen.

Das gleiche gilt für Menschen kommentierten Zeiten wie "10:30pm" wo ein Wert wie 1350 22 Stunden und 30 Minuten bedeutet, oder sogar 2230 wenn Sie nicht Lücken zwischen den Intervallen kümmern. Diese sind leicht zu vergleichen: 1130<230 ist aufgrund von ASCII-Sortierproblemen nie plötzlich wahr.

Verwandte Themen