Ich habe an der Tochigi Ruby Conference 09 aus der Ferne teilgenommen und den LT, den ich dort gesehen habe ich kann dich nicht mehr fragen! Verwendung von Struct und zukünftigen Möglichkeiten Ich habe zum ersten Mal etwas über die Struct-Klasse gelernt. Was das so bequem gemacht hat! Also habe ich beschlossen, einen Artikel als Erleuchtung zu schreiben. Ich habe Ruby seit 10 Jahren berührt, aber ich habe immer noch Entdeckungen. Nett! ~~ Nur nicht lernen ?? ~~
Ruby 2.7.0 Referenzhandbuch Struct Class
Strukturklasse. Struct.new generiert eine neue Unterklasse dieser Klasse. Einzelne Strukturen werden mit Struct.new aus Unterklassen generiert. Jede Strukturunterklasse definiert Zugriffsmethoden für die Mitglieder der Struktur.
Praktische Strukturklasse, mit der Sie auf einfache Weise Objekte mit Eigenschaften (und Methoden) eines beliebigen Namens erstellen können
#Generieren Sie eine Struct-Unterklasse mit vier Parametern
BreakwaterClub = Struct.new(:id, :name, :grade, :age)
#Erstellen Sie eine Instanz der generierten Unterklasse
bucho = BreakwaterClub.new(1, 'kuroiwa', 3)
#Die erstellte Instanz verfügt über eine Zugriffsmethode für Parameternamen
p bucho.name
#=> "kuroiwa"
bucho.age = 17
#Das Alter, das zum Zeitpunkt der Initialisierung nicht festgelegt wurde, wird festgelegt
p bucho
#=>#<struct BreakwaterClub id=1, name="kuroiwa", grade=3, age=17>
# keyword_init:Durch Angabe von true können Schlüsselwortargumente bei der Initialisierung übergeben werden.
#Schlüsselwortargumente sind leichter zu verstehen, aber die Anzahl der Zeichen ist groß, sodass Sie auswählen können, welches verwendet werden soll.
BreakwaterClub = Struct.new(:id, :name, :grade, :age, keyword_init: true)
hina = BreakwaterClub.new(name: 'tsurugi', grade: 1)
Arrays und Hash, die häufig beim Schreiben kleiner Prozesse in Ruby verwendet werden. Es wird auch beim Organisieren während der Ausgabe von Verarbeitungen verwendet, die in meinem Kopf noch nicht organisiert wurden.
#Array
bucho = [1, 'kuroiwa', 3]
bucho[0] #=>1
bucho[1] #=>'kuroiwa'
bucho[2] #=>3
# Hash
bucho = {id: 1, name: 'kuroiwa', grade: 3}
bucho[:id] #=>1
bucho[:name] #=>'kuroiwa'
bucho[:grade] #=>3
Ich bin dafür dankbar, denn wenn ich es in Hash definiere, ist es Tippfehler, aber ich merke es nicht und es heißt "Warum funktioniert es nicht ... es sollte passen ...".
senpai = BreakwaterClub.new(name: 'ohno', grade: 2)
senpai[:height] #=>NameError (no member 'height' in struct)
senpai.height #=>NoMethodError
#Sie können darauf verweisen, auch wenn Sie es nicht als Hash definieren
senpai[:height] #=>nil
Mit anderen Worten, Sie können sich das als aufwärtskompatibel vorstellen.
natsumi = BreakwaterClub.new(name: 'hodaka', grade: 1)
#Es kann wie ein Array zugegriffen werden. Die Reihenfolge der Indizes ist`Struct.new`In der in definierten Reihenfolge
natsumi[0] #=>nil
natsumi[1] #=>'hodaka'
#Kann wie Hash zugegriffen werden
natsumi[:id] #=>nil
natsumi[:grade] #=>1
#Kann in ein Array oder einen Hash konvertiert werden
natsumi.to_a #=>[nil, "hodaka", 1, nil]
natsumi.to_h #=>{:id=>nil, :name=>"hodaka", :grade=>1, :age=>nil}
Eine Methode kann definiert werden, indem ein Block zum Zeitpunkt von "Struct.new" angegeben wird
BreakwaterClub = Struct.new(:id, :name, :grade, :age, keyword_init: true) do
def gakunen
"#{grade}Klasse"
end
end
# `Struct.new`Es ist auch möglich, eine Unterklasse zu erstellen, die die in generierte Struct-Klasse erbt
Class BreakwaterClub < Struct.new(:id, :name, :grade, :age, keyword_init: true)
def gakunen
"#{grade}Klasse"
end
end
Es scheint veraltet zu sein, Unterklassen zu definieren, die von der Struct-Klasse selbst erben. Ich verstehe hier immer noch nicht ein bisschen gut. Da die Struct-Klasse, die die Vererbungsquelle darstellt, eine dynamisch generierte anonyme Klasse ist, liegt dies meiner Meinung nach an der Unbestimmtheit.
Wenn Sie einen Block angeben
Wenn in Struct.new ein Block angegeben ist, wird der Block mit der definierten Struktur als Kontext ausgewertet. Die definierte Struktur wird auch an die Blockparameter übergeben.
Customer = Struct.new(:name, :address) do def greeting "Hello #{name}!" end end Customer.new("Dave", "123 Main").greeting # => "Hello Dave!"
> Diese Methode wird beim Anpassen von Struct empfohlen. Dies liegt daran, dass anonyme Klassen beim Anpassen möglicherweise nicht mehr verwendet werden, indem Unterklassen anonymer Klassen erstellt werden.
> [SEE_ALSO] [Class.new](https://docs.ruby-lang.org/ja/latest/method/Class/s/new.html)
## Zusammenfassung
Die Struct-Klasse ist praktisch. Ich denke, es ist eine Ruby-ähnliche Klasse mit einer Vielzahl von Beschreibungsmethoden.
### Zusammenfassung der Strukturklasse
--Strukturklasse, die beliebige Parameter und Methoden definieren kann
- Zugänglich wie ein Array oder Hash, und eine Typkonvertierung ist ebenfalls möglich
- Wenn der Parametername zum Zeitpunkt der Initialisierung nicht angegeben wird, tritt ein Fehler auf (Hash führt zu "nil").
### Wann ist es bequem zu bedienen?
――Wenn es mit einem Array oder Hash gemacht wird, ist es besser, es als Klasse zu definieren
――Wenn Sie einen kleinen Code schreiben und eine Überprüfung durchführen möchten
--Wenn die Idee nicht ausreichend organisiert ist, um die Klasse zu definieren
- Hey, wenn Sie über eine API testen möchten, die Sie nicht treffen können
Ich habe es noch nicht ausprobiert, aber ich hatte das Gefühl, dass es auch beim Testen mit Rails 'Rspec verwendet werden kann.
Sie können irb gerne ausprobieren. Wenn Sie interessiert sind, probieren Sie es bitte aus.
Recommended Posts