Ruby-Version: Bestätigter Vorgang mit 2.5.1.
Bisher habe ich nur die "jede Methode" verwendet, wenn es um Array-Methoden geht. (Ich bin ein Anfänger, ungefähr 2 Monate nachdem ich ernsthaft angefangen habe, Programmieren zu lernen.) Wenn ich eine persönliche Anwendung mit Rails entwickle, sage ich oft: "Ich möchte die aus der DB-Tabelle erhaltenen Array-Daten gut verarbeiten und nur die erforderlichen Elemente anzeigen, aber ich kann es nicht gut machen." Während ich verschiedene Dinge recherchierte, um das Problem zu lösen, lernte ich viel: "Gibt es eine so bequeme Methode?". Also werde ich sie als Memorandum schreiben und mein Wissen festigen.
Ich hoffe, es wird jedem helfen.
Junichi Itos "Einführung in Ruby für Profis"
Die Qiita-Artikel, Bücher usw. von Herrn Ito sind sehr leicht zu verstehen und immer verschuldet.
users = [
{name: 'Matsuda', score: 80},
{name: 'Otsuka', score: 60},
{name: 'Koike', score: 90},
{name: 'Inoue', score: 40},
{name: 'Matsumoto', score: 50},
{name: 'Fujisawa', score: 85}
]
Ich werde jede Methode erklären, während ich die Operation unten überprüfe.
Die select-Methode
führt die im Block angegebene Verarbeitung für jedes Element des Arrays durch. Gibt nur ein Array der Elemente zurück, deren Rückgabewert "true" ist.
select.rb
#Ich möchte nur Benutzer mit einer Punktzahl von 70 oder höher!
users = [
{name: 'Matsuda', score: 80},
{name: 'Otsuka', score: 60},
{name: 'Koike', score: 90},
{name: 'Inoue', score: 40},
{name: 'Matsumoto', score: 50},
{name: 'Fujisawa', score: 85}
]
#Verwenden Sie select, um nur Benutzer mit einer Punktzahl von 70 oder höher zu sammeln
goukaku_users = users.select { |user| user[:score] >= 70 }
#Überprüfen Sie den Inhalt der neu erstellten Variablen
p goukaku_users
# =>[{:name=>"Matsuda", :score=>80}, {:name=>"Koike", :score=>90}, {:name=>"Fujisawa", :score=>85}]
#Ich konnte ein Array nur für Benutzer mit einer Punktzahl von 70 oder höher erstellen!
do ... end
wird in einer Notationszeile mit {}
geschrieben.
Es ist eine Schande, aber es tut mir leid, wenn es schwierig ist, den Variablennamen zu verstehen.Die "Zurückweisungsmethode" ist das Gegenteil der "Auswahlmethode" und ist eine Methode, die ein Array zurückgibt, das nur die Elemente sammelt, deren Rückgabewert der Verarbeitung im Block "falsch" ist.
reject.rb
#Ich möchte nur Benutzer mit einer Punktzahl von 70 oder weniger!
users = [
{name: 'Matsuda', score: 80},
{name: 'Otsuka', score: 60},
{name: 'Koike', score: 90},
{name: 'Inoue', score: 40},
{name: 'Matsumoto', score: 50},
{name: 'Fujisawa', score: 85}
]
#Sammeln Sie mit der Ablehnungsmethode nur Benutzer mit einer Punktzahl von 70 oder weniger
fugoukaku_users = users.reject { |user| user[:score] > 70 }
#Überprüfen Sie den Inhalt der neu erstellten Variablen
p fugoukaku_users
# => [{:name=>"Otsuka", :score=>60}, {:name=>"Inoue", :score=>40}, {:name=>"Matsumoto", :score=>50}]
#Ich konnte ein Array nur für Benutzer mit einer Punktzahl von 70 oder weniger erstellen!
Die Methode keep_if ruft auch jedes Element des Arrays der Reihe nach ab und führt die angegebene Verarbeitung im Block durch. Wenn der Rückgabewert "true" ist, bleibt das an den Block übergebene Element im Array, und wenn der Rückgabewert "false" ist, wird es aus dem Array gelöscht.
keep_if.rb
#Ich möchte nur Benutzer mit einer Punktzahl von 70 oder höher!
users = [
{name: 'Matsuda', score: 80},
{name: 'Otsuka', score: 60},
{name: 'Koike', score: 90},
{name: 'Inoue', score: 40},
{name: 'Matsumoto', score: 50},
{name: 'Fujisawa', score: 85}
]
# keep_Verwenden Sie die if-Methode, um nur Benutzer mit einer Punktzahl von 70 oder höher zu verarbeiten
#Benutzerelement mit einer Punktzahl von weniger als 70 entfernt
users.keep_if { |user| user[:score] >= 70 }
# keep_Nach der if-Methode
p users
# => [{:name=>"Matsuda", :score=>80}, {:name=>"Koike", :score=>90}, {:name=>"Fujisawa", :score=>85}]
#Die ursprünglichen Array-Benutzer können jetzt nur noch Benutzer mit einer Punktzahl von 70 oder höher sein!
Die delete_if-Methode
ruft auch jedes Element des Arrays der Reihe nach ab und führt die angegebene Verarbeitung im Block durch. Wenn der Rückgabewert "true" ist, wird das an den Block übergebene Element aus dem ursprünglichen Array gelöscht. Wenn der Rückgabewert "false" ist, belassen Sie ihn im Array.
delete_if.rb
#Ich möchte nur Benutzer mit einer Punktzahl von 70 oder weniger!
users = [
{name: 'Matsuda', score: 80},
{name: 'Otsuka', score: 60},
{name: 'Koike', score: 90},
{name: 'Inoue', score: 40},
{name: 'Matsumoto', score: 50},
{name: 'Fujisawa', score: 85}
]
# delete_Verwenden Sie die if-Methode, um nur Benutzer mit einer Punktzahl von 70 oder weniger zu verarbeiten
#Benutzerelement mit einer Punktzahl von mehr als 70 entfernt
users.delete_if { |user| user[:score] > 70 }
# delete_Nach der if-Methode
p users
# => [{:name=>"Otsuka", :score=>60}, {:name=>"Inoue", :score=>40}, {:name=>"Matsumoto", :score=>50}]
#Die ursprünglichen Array-Benutzer wurden in ein Array von nur Benutzern mit einer Punktzahl von 70 oder weniger geändert!
Die Methoden keep_if
und delete_if
sind die gleichen wie die in den Abschnitten 1 und 2 erläuterten Methoden select method
und reply method
!?
Ich dachte, aber im Vergleich
select / reject Das ursprüngliche Array bleibt unverändert, aber die Elemente, die die Bedingungen erfüllen, werden gesammelt und ein vollständig neues Array zurückgegeben. Weisen Sie es daher bei der Wiederverwendung einer Variablen zu. delete_if / keep_if Löschen Sie die Elemente, die die Bedingungen erfüllen, aus dem ursprünglichen Array. Mit anderen Worten, die Form des ursprünglichen Arrays selbst wird geändert. Daher kann es mit dem ursprünglichen Variablennamen wiederverwendet werden.
Es ist ähnlich, aber es scheint einen solchen Unterschied zu geben.
Die find-Methode
gibt das erste Element zurück, für das der Rückgabewert des im Block angegebenen Prozesses true
ist.
find.rb
#Ich möchte den ersten Benutzer erhalten, dessen Punktzahl der Array-Benutzer 70 oder mehr beträgt!
users = [
{name: 'Matsuda', score: 80},
{name: 'Otsuka', score: 60},
{name: 'Koike', score: 90},
{name: 'Inoue', score: 40},
{name: 'Matsumoto', score: 50},
{name: 'Fujisawa', score: 85}
]
#Holen Sie sich mit der Suchmethode den ersten Benutzer mit einer Punktzahl von 70 oder höher
goukaku_user = users.find { |user| user[:score] >= 70 }
#Überprüfen Sie den Inhalt der neu erstellten Variablen
p goukaku_user
# => {:name=>"Matsuda", :score=>80}
#Ich konnte den ersten Benutzer mit einer Punktzahl von 70 oder höher im Array bekommen!
Versuchen Sie für alle Fälle, den Zustand der Punktzahl im Block von 70 auf 85 zu ändern, und überprüfen Sie ihn erneut.
find.rb
#Ich möchte den ersten Benutzer erhalten, dessen Punktzahl der Array-Benutzer 85 oder mehr beträgt!
users = [
{name: 'Matsuda', score: 80},
{name: 'Otsuka', score: 60},
{name: 'Koike', score: 90},
{name: 'Inoue', score: 40},
{name: 'Matsumoto', score: 50},
{name: 'Fujisawa', score: 85}
]
#Holen Sie sich mit der Suchmethode den ersten Benutzer mit einer Punktzahl von 85 oder höher
goukaku_user = users.find { |user| user[:score] >= 85 }
#Überprüfen Sie den Inhalt der neu erstellten Variablen
p goukaku_user
# => {:name=>"Koike", :score=>90}
#Ich konnte den ersten Benutzer mit einer Punktzahl von 85 oder höher im Array bekommen!
Die map-Methode
gibt den Rückgabewert als neues Array als Ergebnis der im Block für jedes Element angegebenen Verarbeitung zurück.
map.rb
#Ich möchte dem Namen der Array-Benutzer "san" hinzufügen!
users = [
{name: 'Matsuda', score: 80},
{name: 'Otsuka', score: 60},
{name: 'Koike', score: 90},
{name: 'Inoue', score: 40},
{name: 'Matsumoto', score: 50},
{name: 'Fujisawa', score: 85}
]
san_users = users.map { |user| user[:name] + 'Herr.' }
#Überprüfen Sie den Inhalt der neu erstellten Variablen
p san_users
# => ["Herr Matsuda", "Herr Otsuka", "Herr Koike", "Inoue", "Herr Matsumoto", "Herr Fujisawa"]
Das? Es war ein bisschen anders als ich erwartet hatte. Die "Map-Methode" scheint sich ein wenig anders zu verhalten als die bisher beschriebenen Array-Methoden.
Speziell, Anstatt die Elemente des ursprünglichen Arrays auszuwerten und die Elemente zu transformieren, um die Werte zurückzugeben, werden die Rückgabewerte der Verarbeitungsergebnisse einzeln im Array gespeichert und das neu erstellte Array zurückgegeben.
Wenn Sie die Kartenmethode von JavaScript kennen, ist sie möglicherweise leicht zu verstehen.
map.rb
#Wenn Sie also im Hash-Format zurückkehren möchten, während Sie die ursprüngliche Form beibehalten, schreiben Sie wie folgt
san_users = users.map { |user| {name: user[:name]+'Herr.', score: user[:score]} }
p san_users
# => [{:name=>"Herr Matsuda", :score=>80}, {:name=>"Herr Otsuka", :score=>60}, {:name=>"Herr Koike", :score=>90}, {:name=>"Inoue", :score=>40}, {:name=>"Herr Matsumoto", :score=>50}, {:name=>"Herr Fujisawa", :score=>85}]
#Ich konnte ein Array mit "san" zum Namen erstellen!
Vielen Dank für das Lesen des Artikels.
Ich bin mir sehr bewusst, dass wenn Sie mit Rails entwickeln und die Methode nicht kennen, dies einen großen Einfluss auf die Bandbreite der Möglichkeiten und das Code-Refactoring hat. Ich spüre wieder die Wichtigkeit der Grundlagen.
Wenn Sie Fehler im Inhalt finden, können Sie uns gerne darauf hinweisen und uns Ihre Meinung mitteilen!
Recommended Posts