Als ich Ruby zum ersten Mal seit langer Zeit wieder berührt habe, habe ich es nicht so gut verstanden, dass ich überrascht war, also habe ich es nachgeschlagen.
Im Falle einer solchen unangenehmen Kombination von Array und Hash.
test.rb
user_data = [
{ user: { profile: { name: 'George', sex: 'man' } } },
{ user: { profile: { name: 'Alice', sex: 'woman' } } },
{ user: { profile: { name: 'Taro', sex: 'man' } } }
]
In dem Array gibt es einen Hash namens Benutzer, es gibt einen Hash namens Profil verschachtelt und es gibt einen Wert im Schlüssel namens Name ... Ich verstehe nicht mehr.
Nehmen wir das raus.
So was
test.rb
puts user_data[0][:user][:profile][:name]
Wenn Sie 'Alice' herausnehmen, sieht es natürlich so aus
test.rb
puts user_data[1][:user][:profile][:name]
Ich habe gerade die Position des Arrays geändert.
Wenn Sie das Geschlecht im Hash von 'Alice' abrufen möchten
test.rb
puts user_data[1][:user][:profile][:sex]
Ich habe gerade geändert: Name zu: Geschlecht.
Da es sich um ein Array handelt, können Sie jedes einzeln extrahieren.
test.rb
user_data.each do |values|
puts values[:user][:profile][:name]
end
Das Ergebnis wird sein
test.rb
George
Alice
Taro
Ab Ruby 2.3 ist dig als neue Methode verfügbar, die in Hash-Klassen verwendet werden kann.
test.rb
puts user_data.dig(0, :user, :profile, :name)
Wenn der Hash in einem Array enthalten ist, geben Sie einfach die gewünschte Anzahl von Daten in das Argument ein.
test.rb
user_data.each do |values|
puts values.dig(:user, :profile, :name)
end
Es scheint der Unterschied zwischen der Rückgabe mit einem Fehler und der Rückgabe mit Null zu sein, wenn der Schlüssel nicht gefunden wird. Wenn Sie dig verwenden, wird es als Null zurückgegeben, sodass Sie keine Maßnahmen gegen Fehler ergreifen müssen. (Bis dahin verwendete er die Abrufmethode usw.)
test.rb
user_data = [
{user: {}},
{user: {}},
{user: {}}
]
#Bei Verwendung von dig
user_data.each do |values|
puts values.dig(:user, :profile, :age)
end
#Wenn Sie nicht dig verwenden
user_data.each do |values|
puts values[:user][:profile][:age]
end
Das Ergebnis sieht so aus
test.rb
% ruby tmp/test.rb
#=> nil
#=> undefined method `[]' for nil:NilClass (NoMethodError)
Recommended Posts