[RAILS] Une histoire très utile sur la classe Struct de Ruby

Déclencheur

J'ai participé à Tochigi Ruby Conference 09 à distance, et le LT que j'ai vu là-bas je ne peux plus vous demander! Comment utiliser Struct et les possibilités futures J'ai découvert la classe Struct pour la première fois. Ce qui est si pratique! J'ai donc décidé d'écrire un article comme une illumination. Je touche Ruby depuis 10 ans, mais j'ai encore des découvertes. Agréable! ~~ Je n'apprends tout simplement pas ?? ~~

Qu'est-ce que la classe Struct?

Manuel de référence Ruby 2.7.0 Struct Class

Classe de structure. Struct.new générera une nouvelle sous-classe de cette classe. Les structures individuelles sont générées à partir de sous-classes à l'aide de Struct.new. Chaque sous-classe de structure définit les méthodes d'accès pour les membres de la structure.

Pour expliquer dans ma propre interprétation

Classe de structure pratique qui vous permet de créer facilement des objets avec des propriétés (et des méthodes) de n'importe quel nom

Comment utiliser

#Générer une sous-classe Struct avec quatre paramètres
BreakwaterClub = Struct.new(:id, :name, :grade, :age)
#Créer une instance de la sous-classe générée
bucho = BreakwaterClub.new(1, 'kuroiwa', 3)

#L'instance créée a une méthode d'accesseur pour les noms de paramètres
p bucho.name
#=> "kuroiwa"
bucho.age = 17

#L'âge qui n'a pas été défini au moment de l'initialisation est défini
p bucho
#=>#<struct BreakwaterClub id=1, name="kuroiwa", grade=3, age=17>
# keyword_init:En spécifiant true, les arguments de mot-clé peuvent être passés à l'initialisation.
#Les arguments de mots-clés sont plus faciles à comprendre, mais le nombre de caractères est important, vous pouvez donc choisir celui à utiliser.
BreakwaterClub = Struct.new(:id, :name, :grade, :age, keyword_init: true)

hina = BreakwaterClub.new(name: 'tsurugi', grade: 1)

Qu'est-ce qui vous rend heureux par rapport au hachage et aux tableaux?

Tableaux et hachage souvent utilisés lors de l'écriture de petits processus dans Ruby. Il est également utilisé lors de l'organisation lors de la sortie d'un traitement qui n'a pas encore été organisé dans mon esprit.

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

Une erreur se produit si un paramètre non défini est spécifié.

Je suis reconnaissant pour cela parce que quand je le définis dans Hash, c'est Typo, mais je ne le remarque pas et il y a quelque chose comme "Pourquoi ça ne marche pas ... ça devrait correspondre ...".

senpai = BreakwaterClub.new(name: 'ohno', grade: 2)
senpai[:height] #=>NameError (no member 'height' in struct)
senpai.height   #=>NoMethodError
#Vous pouvez vous y référer même si vous ne le définissez pas comme Hash
senpai[:height] #=>nil

La classe Struct est accessible et convertible en type comme les tableaux et Hash.

En d'autres termes, vous pouvez le considérer comme compatible vers le haut.

natsumi = BreakwaterClub.new(name: 'hodaka', grade: 1)
#Il est accessible comme un tableau. L'ordre des index est`Struct.new`Dans l'ordre défini dans
natsumi[0] #=>nil
natsumi[1] #=>'hodaka'
#Peut être consulté comme Hash
natsumi[:id]    #=>nil
natsumi[:grade] #=>1
#Peut être converti en tableau ou en hachage
natsumi.to_a #=>[nil, "hodaka", 1, nil]
natsumi.to_h #=>{:id=>nil, :name=>"hodaka", :grade=>1, :age=>nil}

La définition de la méthode est possible

Une méthode peut être définie en spécifiant un bloc au moment de Struct.new

BreakwaterClub = Struct.new(:id, :name, :grade, :age, keyword_init: true) do
  def gakunen
    "#{grade}Classe"
  end
end
# `Struct.new`Il est également possible de créer une sous-classe qui hérite de la classe Struct générée dans
Class BreakwaterClub < Struct.new(:id, :name, :grade, :age, keyword_init: true)
  def gakunen
    "#{grade}Classe"
  end
end

Il semble déconseillé de définir des sous-classes qui héritent de la classe Struct elle-même. Je ne comprends toujours pas un peu bien ici. Étant donné que la classe Struct qui est la source d'héritage est une classe anonyme générée dynamiquement, je pense que cela est dû à l'indéfinité.

référence:

Si vous spécifiez un bloc

Si un bloc est spécifié dans Struct.new, le bloc est évalué avec le Struct défini comme contexte. La structure définie est également transmise aux paramètres de bloc.

Customer = Struct.new(:name, :address) do def greeting "Hello #{name}!" end end Customer.new("Dave", "123 Main").greeting # => "Hello Dave!"

 > Cette méthode est recommandée lors de la personnalisation de Struct. Cela est dû au fait que les classes anonymes ne peuvent plus être utilisées lors de la personnalisation en créant des sous-classes de classes anonymes.
> [SEE_ALSO] [Class.new](https://docs.ruby-lang.org/ja/latest/method/Class/s/new.html)

## Résumé
 La classe Struct est pratique. Je pense que c'est une classe de type Ruby avec une grande variété de méthodes de description.

### Résumé de la classe Struct
 - Classe de structure qui peut définir des paramètres et des méthodes arbitraires
 --Accessible comme un tableau ou un hachage, et la conversion de type est également possible
 --Si le nom du paramètre n'est pas spécifié au moment de l'initialisation, une erreur se produira (le hachage entraînera `nil`).

### Quand est-ce pratique à utiliser?
 ――Quand c'est fait avec un tableau ou un hachage, mais il vaut mieux le définir comme une classe
 ――Lorsque vous voulez écrire un petit code et faire une vérification
 --Lorsque l'idée n'est pas suffisamment organisée pour définir la classe
 - Hé, quand vous voulez tester via une API que vous ne pouvez pas frapper

 Je ne l'ai pas encore essayé, mais j'ai senti qu'il pouvait être utilisé même lors de tests avec Rails Rspec.
 Vous pouvez vous sentir libre d'essayer irb, donc si vous êtes intéressé, essayez-le.




Recommended Posts

Une histoire très utile sur la classe Struct de Ruby
Un murmure sur la classe utilitaire
Une histoire sur la conversion des codes de caractères de UTF-8 en Shift-jis en Ruby
L'histoire de la rencontre d'un débordement arithmétique qui ne devrait pas être rencontré dans Ruby
Une histoire sur la prise en charge de Java 11 pour les services Web
Une histoire sur le JDK à l'ère de Java 11
Une histoire sur la création d'un Builder qui hérite du Builder
Histoire d'essayer de faire fonctionner le fichier JAVA
L'histoire d'un nouvel ingénieur lisant un programmeur passionné
À propos des symboles Ruby
À propos de l'héritage de classe.
À propos de Ruby Hash
À propos des tableaux Ruby
À propos de l'héritage Ruby
À propos de Ruby Block
À propos de la classe Java
À propos de Ruby Hash
À propos des symboles Ruby
À propos des méthodes Ruby
[PHP] Histoire de la sortie de PDF avec TCPDF + FPDI
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
Une histoire d'essayer de s'entendre avec Mockito
Une histoire sur l'effort de décompiler les fichiers JAR
Une histoire sur la réduction de la consommation de mémoire à 1/100 avec find_in_batches
Une histoire sur l'introduction d'Evolutions dans le cadre de jeu
Une histoire sur le développement de ROS appelé rosjava avec java
L'histoire du démarrage d'une session de lecture sur Java pour les nouveaux arrivants
Une histoire de rendre catkin_make de rosjava compatible hors ligne
L'histoire de l'introduction d'un framework sans serveur très semblable à Rails "Ruby on Jets" dans l'environnement de production