2016-08-05 2 views
-1

Ich spiele mit verschachtelten Hashes herum. Aufgabe:Warum bekomme ich einen TypeError: keine implizite Umwandlung von Symbol in Integer?

Create three hashes called person1 , person2 , and person3 , with first and last names under the keys :first and :last . Then create a params hash so that params[:father] is person1 , params[:mother] is person2 , and params[:child] is person3 . Verify that, for example, params[:father][:first] has the right value.

Meine Lösung:

person1 = {first: "first_name1", last: "last_name1"} 
person2 = {first: "first_name2", last: "last_name2"} 
person3 = {first: "first_name3", last: "last_name3"} 
params = { :father => ":person1", :mother => ":person2", :child => ":person3" } 

dann params[:father][:first] gibt

TypeError: no implicit conversion of symbol into Integer

Warum? Ich verstehe nicht, warum ich den TypeError bekomme.

+0

Parameter Zugriffsschlüssel Wertepaar params = {: Vater => "person1",: mother => ": person2",: child => "person3"} und Zugriff params [: vater] geben Ergebnis "person1" –

+0

Das ist verständlich. Es gab mehr als ein Argument, über das ich verwirrt war. – Savina10

Antwort

3

Wenn Sie Werte zu den params Hash-Schlüssel zuweisen, liefern Sie Strings statt personx Hashes. Der richtige Weg wäre

params = { :father => ":person1"... 

tun

params = { :father => person1... 

Der Grund, statt sein, dass der Fehler ist wie folgt. Diese Zeile:

params[:father][:first] 

holt den Wert von params[:father] zuerst. Sie erwarten, dass dieser Wert ein Hash ist, aber aufgrund des obigen Syntaxfehlers handelt es sich um eine Zeichenfolge. String implementiert [] Methode wie Hash, aber seine Semantik ist anders. Es greift auf ein Zeichen innerhalb einer Zeichenkette mit seinem ganzzahligen Index zu. Er erwartet, dass der Index als Argument an [] übergeben wird.

Da Sie ein Symbol passieren stattdessen [:first], und es gibt keinen Standard-Weg, ein Symbol zu konvertieren integer, können Sie die entsprechende Fehlermeldung erhalten:

TypeError: no implicit conversion of symbol into Integer

+0

Aus irgendeinem Grund war es die Zeichenfolge "", die mich über die Syntax verwirrt hat. Ich verstehe jetzt. – Savina10

0

Verwenden Sie diese Variablennamen. Wie unten:

params = { :father => person1, :mother => person2, :child => person3 }