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 ?? ~~
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.
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
#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)
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
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
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}
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é.
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.