[RAILS] Eine sehr nützliche Geschichte über Rubys Struct-Klasse

Auslösen

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 ?? ~~

Was ist die Struct-Klasse?

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.

In meiner eigenen Interpretation zu erklären

Praktische Strukturklasse, mit der Sie auf einfache Weise Objekte mit Eigenschaften (und Methoden) eines beliebigen Namens erstellen können

Wie benutzt man

#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)

Was macht dich glücklich im Vergleich zu Hash und Arrays?

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

Ein Fehler tritt auf, wenn ein undefinierter Parameter angegeben wird.

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

Die Struct-Klasse ist wie Arrays und Hash zugänglich und typkonvertierbar.

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}

Methodendefinition ist möglich

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.

Referenz:

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

Eine sehr nützliche Geschichte über Rubys Struct-Klasse
Ein Murmeln über die Utility-Klasse
Eine Geschichte über das Konvertieren von Zeichencodes von UTF-8 in Shift-jis in Ruby
Die Geschichte eines arithmetischen Überlaufs, der in Ruby nicht auftreten sollte
Eine Geschichte über die Java 11-Unterstützung für Webdienste
Eine Geschichte über das JDK in der Java 11-Ära
Eine Geschichte über das Erstellen eines Builders, der den Builder erbt
Die Geschichte des Versuchs, JAVA File zu bedienen
Die Geschichte eines neuen Ingenieurs, der einen leidenschaftlichen Programmierer liest
Über Ruby-Symbole
Informationen zur Klassenvererbung.
Über Ruby Hash
Über Ruby-Arrays
Informationen zur Ruby-Vererbung
Über Rubinblock
Über die Java-Klasse
Über Ruby Hash
Über Ruby-Symbole
Über Ruby-Methoden
[PHP] Geschichte der Ausgabe von PDF mit TCPDF + FPDI
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
Eine Geschichte über den Versuch, mit Mockito auszukommen
Eine Geschichte über das Bemühen, JAR-Dateien zu dekompilieren
Eine Geschichte über die Reduzierung des Speicherverbrauchs auf 1/100 mit find_in_batches
Eine Geschichte über die Einführung von Evolutions in das Play Framework
Eine Geschichte über die Entwicklung von ROS namens Rosjava mit Java
Die Geschichte des Startens einer Java-bezogenen Lesesitzung für Neulinge
Eine Geschichte darüber, wie catkin_make von Rosjava offline kompatibel gemacht wird
Die Geschichte der Einführung eines sehr Rails-ähnlichen serverlosen Frameworks "Ruby on Jets" in die Produktionsumgebung