Instanciation et méthode d'initialisation

01

of 02

Instanciation et méthode d'initialisation

Apprendre Ruby on Rails: jouer avec irb
brnzwngs / Flikr / CC BY 2.0

Lorsque vous définissez une classe dans Ruby, Ruby attribue un nouvel objet de classe au constante de nom de classe. Par exemple, si vous deviez dire Personne de classe; fin, cela équivaut à peu près à Personne = Class.new. Cet objet de classe est du type Classeet contient un certain nombre de méthodes utiles pour créer des instances de copies de ces instances.

02

of 02

Créer des instances

Pour créer une nouvelle instance d'une classe, appelez cette classe Nouveau méthode. Par défaut, cela allouera la mémoire requise pour la classe et renverra une référence au nouvel objet. Donc, si vous deviez créer une nouvelle instance de la La personne classe, vous appelleriez Person.new.

Si au début cela semble un peu en arrière, il n'y a pas Nouveau mot-clé dans Ruby ou toute syntaxe spéciale. De nouveaux objets sont créés par une méthode normale qui, tout compte fait, fait des choses relativement simples.

Initialisation des instances

instagram viewer

Un objet vide n'est pas très excitant. Pour commencer à utiliser votre objet, il doit d'abord être initialisé (en supposant qu'il variables d'instance qui doit être initialisé). Cela se fait via le initialiser méthode. Ruby transmettra tous les arguments auxquels vous passez SomeClass.new sur initialiser sur le nouvel objet. Vous pouvez ensuite utiliser des affectations de variables et des méthodes normales pour initialiser l'état de l'objet. Dans cet exemple, un La personne classe est présentée dont initialiser La méthode prendra un nom et un argument d'âge et les affectera aux variables d'instance.

classe Person def initialize (name, age) @name, @age = name, age end end bob = Person.new ('Bob', 34)

Vous pouvez également utiliser cette opportunité pour acquérir toutes les ressources dont vous pourriez avoir besoin. Réseau ouvert douilles, ouvrez des fichiers, lisez toutes les données dont vous avez besoin, etc. La seule mise en garde est que les gens ne s'attendent généralement pas initialiser échouer. Assurez-vous de documenter tout échec éventuel initialiser méthodes.

Objets destructeurs

En général, vous ne détruisez pas d'objets dans Ruby. Si vous venez de C ++ ou d'un autre langage sans garbage collector, cela peut sembler étrange. Mais dans Ruby (et la plupart des autres langages récupérés), vous ne détruisez pas les objets, vous cessez simplement de vous y référer. Lors du prochain cycle de récupération de place, tout objet sans aucune référence s'y rapportant sera détruit automatiquement. Il y a quelques bugs avec des références circulaires, mais en général cela fonctionne parfaitement et vous n'avez même pas besoin d'un "destructeur".

Si vous vous interrogez sur les ressources, ne vous en faites pas. Lorsque l'objet contenant la ressource est détruit, la ressource sera libérée. Les fichiers ouverts et les connexions réseau seront fermés, la mémoire désallouée, etc. Ce n'est que si vous allouez des ressources dans une extension C que vous aurez vraiment besoin de vous soucier de la désallocation des ressources. Bien qu'il n'y ait aucune garantie quand le ramasse-miettes sera exécuté. Afin de répartir les ressources dans un opportun manière, essayez de les libérer manuellement.

Faire des copies d'objets

Ruby est passé par référence. Si vous passez une référence à un objet à un méthode, et cette méthode appelle une méthode qui modifie l'état de cet objet, des conséquences inattendues peuvent se produire. En outre, les méthodes peuvent ensuite enregistrer la référence à l'objet à modifier à un moment beaucoup plus tard, provoquant un effet retardé pour le bogue. Pour éviter cela, Ruby propose quelques méthodes pour dupliquer des objets.

Pour dupliquer un objet, appelez simplement le some_object.dup méthode. Un nouvel objet sera alloué et toutes les variables d'instance de l'objet seront copiées. Cependant, la copie de variables d'instance est ce que cela était censé éviter: c'est ce qu'on appelle une "copie superficielle". Si vous deviez conserver un fichier dans une variable d'instance, les deux objets dupliqués feraient désormais référence au même fichier.

Sachez simplement que les copies sont des copies superficielles avant d'utiliser le dup méthode. Voir l'article Faire des copies profondes dans Ruby pour plus d'informations.