Variables d'instance dans les variables Ruby

Café avec arobase

H&S Production / Getty Images





Les variables d'instance commencent par un arobase (@) et ne peuvent être référencées qu'au sein des méthodes de classe. Elles diffèrent des variables locales en ce qu'elles n'existent dans aucun portée . Au lieu de cela, une table de variables similaire est stockée pour chaque instance d'une classe. Les variables d'instance vivent dans une instance de classe, donc tant que cette instance reste en vie, les variables d'instance le seront aussi.

Les variables d'instance peuvent être référencées dans n'importe quelle méthode de cette classe. Toutes les méthodes d'une classe utilisent la même instance tableau des variables , par opposition aux variables locales où chaque méthode aura une table de variables différente. Il est toutefois possible d'accéder aux variables d'instance sans les définir au préalable. Cela ne déclenchera pas d'exception, mais la valeur de la variable sera néant et un avertissement sera émis si vous avez exécuté Ruby avec le -dans changer.



Cet exemple illustre l'utilisation de variables d'instance. Notez que le case contient le -dans commutateur, qui imprimera des avertissements s'ils se produisent. Notez également l'utilisation incorrecte en dehors d'une méthode dans la portée de la classe. Ceci est incorrect et discuté ci-dessous.

Pourquoi est-ce que @test variables incorrectes ? Cela a à voir avec la portée et la façon dont Ruby implémente les choses. Dans une méthode, la portée de la variable d'instance fait référence à l'instance particulière de cette classe. Cependant, dans la portée de la classe (à l'intérieur de la classe, mais en dehors de toute méthode), la portée est la instance de classe portée. Ruby implémente la hiérarchie des classes en instanciant Classer objets, il y a donc un seconde instance en jeu ici. La première exemple est un exemple de Classer classe, et c'est là @test ira. La deuxième instance est l'instanciation de TestClass , et c'est là @évaluer ira. Cela devient un peu déroutant, mais n'oubliez pas de ne jamais utiliser @variables d'instance en dehors des méthodes. Si vous avez besoin d'un stockage à l'échelle de la classe, utilisez @@class_variables , qui peut être utilisé n'importe où dans la portée de la classe (à l'intérieur ou à l'extérieur des méthodes) et se comportera de la même manière.



Accessoires

Vous ne pouvez normalement pas accéder aux variables d'instance depuis l'extérieur d'un objet. Par exemple, dans l'exemple ci-dessus, vous ne pouvez pas simplement appeler valeur t ou t.@valeur pour accéder à la variable d'instance @évaluer . Cela enfreindrait les règles de encapsulation . Ceci s'applique également aux instances des classes enfants, elles ne peuvent pas accéder aux variables d'instance appartenant à la classe parent même si elles sont techniquement du même type. Ainsi, afin de fournir un accès aux variables d'instance, accesseur méthodes doivent être déclarées.

L'exemple suivant montre comment les méthodes d'accès peuvent être écrites. Cependant, notez que Rubis fournit un raccourci et que cet exemple n'existe que pour vous montrer comment fonctionnent les méthodes d'accès. Il n'est généralement pas courant de voir des méthodes d'accesseur écrites de cette manière, à moins qu'une sorte de logique supplémentaire ne soit nécessaire pour l'accesseur.

Les raccourcis rendent les choses un peu plus faciles et plus compactes. Il existe trois de ces méthodes d'assistance. Ils doivent être exécutés dans la portée de la classe (à l'intérieur de la classe mais en dehors de toute méthode) et définiront dynamiquement des méthodes un peu comme les méthodes définies dans l'exemple ci-dessus. Il n'y a pas de magie ici, et ils ressemblent à des mots-clés de langage, mais ce ne sont en réalité que des méthodes de définition dynamique. De plus, ces accesseurs vont généralement au sommet de la classe. Cela donne au lecteur un aperçu instantané des variables membres qui seront disponibles en dehors de la classe ou des classes enfants.

Il existe trois de ces méthodes d'accès. Ils prennent chacun une liste de symboles décrivant les variables d'instance auxquelles accéder.



    attr_reader- Définir des méthodes de 'lecteur', telles que le Nom méthode dans l'exemple ci-dessus.attr_writer- Définir des méthodes 'writer' telles que la âge = méthode dans l'exemple ci-dessus.attr_accessor- Définissez les méthodes 'reader' et 'writer'.

Quand utiliser les variables d'instance

Maintenant que vous savez ce que sont les variables d'instance, quand les utilisez-vous ? Les variables d'instance doivent être utilisées lorsqu'elles représentent l'état de l'objet. Le nom et l'âge d'un étudiant, ses notes, etc. Ils ne doivent pas être utilisés pour le stockage temporaire, c'est à cela que servent les variables locales. Cependant, ils pourraient éventuellement être utilisés pour le stockage temporaire entre les appels de méthode pour les calculs en plusieurs étapes. Cependant, si vous faites cela, vous voudrez peut-être repenser la composition de votre méthode et transformer ces variables en paramètres de méthode à la place.