Variables d'instance dans Ruby

Les variables d'instance commencent par un signe at (@) et peuvent être référencées uniquement dans les méthodes de classe. Ils diffèrent des variables locales en ce sens qu'ils n'existent pas dans un cadre particulier 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, de sorte que tant que cette instance reste en vie, les variables d'instance le seront également.

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 table variable, par opposition aux variables locales où chaque méthode aura une table de variables différente. Il est cependant 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 -w commutateur.

Cet exemple illustre l'utilisation de variables d'instance. Notez que le

instagram viewer
case contient le -w commutateur, qui affichera 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 @tester variable incorrecte? 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 Classe objets, donc il y a un deuxième instance en jeu ici. La première exemple est une instance de la Classe classe, et c'est là @tester ira. La deuxième instance est l'instanciation de TestClass, et c'est là @valeur 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.

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 t.value ou t. @ valeur pour accéder à la variable d'instance @valeur. Cela enfreindrait les règles de encapsulation. Cela s'applique également aux instances de 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. Donc, afin de donner accès aux variables d'instance, accesseur les méthodes doivent être déclarées.

L'exemple suivant montre comment les méthodes d'accesseur peuvent être écrites. Notez cependant que Rubis fournit un raccourci et que cet exemple existe uniquement pour vous montrer comment fonctionnent les méthodes d'accesseur. Il n'est généralement pas courant de voir les méthodes d'accesseur écrites de cette manière, à moins qu'une sorte de logique supplémentaire 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 tout 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 vraiment que des méthodes qui définissent dynamiquement. De plus, ces accesseurs arrivent généralement en tête de la classe. Cela donne au lecteur un aperçu instantané des variables membres qui seront disponibles en dehors de la classe ou aux classes enfants.

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

  • attr_reader - Définir des méthodes de "lecteur", telles que Nom dans l'exemple ci-dessus.
  • attr_writer - Définir des méthodes "écrivain" telles que âge = dans l'exemple ci-dessus.
  • attr_accessor - Définissez les méthodes "lecteur" et "écrivain".

Quand utiliser les variables d'instance

Maintenant que vous savez quelles 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 élève, 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 à 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.

instagram story viewer