Ruby est l’un des langages les plus utilisés sur le Web. Nous avons récemment lancé une nouvelle série de screencasts sur Nettuts + qui vous présentera Ruby, ainsi que les formidables cadres et outils associés au développement de Ruby. Dans ce chapitre, nous verrons comment créer nos propres classes Ruby..
Au chapitre deux, nous avons appris comment ajouter des méthodes à un objet déjà existant. Si nous voulons commencer avec un objet vierge que nous pouvons ensuite augmenter avec des méthodes et des propriétés, nous pouvons simplement créer une instance de Objet
classe.
o = Object.new def o.my_method 1 + 1 end o.my_method # => 2
Qu'en est-il des propriétés? Eh bien, Ruby a des variables d’instance (variables que chaque instance d’un objet obtient); une variable d'instance commence par un signe 'at' (@
). Vous pouvez obtenir et définir ces variables d'instance en créant des fonctions spécialement à cet effet..
def o.set_name (name) @name = nom end def o.get_name @ name end o.set_name "Andrew" o.get_name # => Andrew
Vous devriez noter que la variable @prénom
n'a pas besoin d'être initialisé n'importe où. Ruby se charge de garder cela organisé pour vous. Maintenant, nous pouvons définir et obtenir les variables d'instance @prénom
. Cependant, n'est-ce pas plutôt moche d'utiliser nom_ensemble
et get_name
pour les propriétés? Faire quelque chose comme o.name = "Andrew"
écrire et o.nom
lire serait tellement plus naturel. Nous verrons comment faire cela dans une minute. mais pour l'instant, commençons à créer une classe de notre propre.
C'est assez simple de créer une classe. Utilisez simplement la syntaxe suivante. Dans cette leçon, nous allons créer une jolie inutile La personne
classe:
classe Personne fin
Encore une fois, super simple. Commençons à le remplir.
Nous avons vu comment créer des propriétés: ce sont juste des wrappers de méthodes pour les variables d'instance. Cependant, nous souhaitons qu’ils agissent davantage comme vous le souhaiteriez. C'est facile pour la méthode get:
def name @name end
Puisque nous sommes dans la classe, nous n’avons pas à donner le nom d’un objet dans la signature de la méthode; juste le nom de la méthode fera l'affaire. Quand on crée une instance du La personne
classe-dire, p1
-nous pourrons appeler cela de la manière habituelle-p1.name
.
Mais comment pouvons-nous améliorer l’apparence de la @prénom
variable?
Ruby nous donne un peu de sucre incroyable pour rendre cela vraiment cool. Regarde ça:
def name = name @name = name end
Ok, et alors? De cette façon, nous écrivons p1.name = ("joe")
ou au moins p1.name = "joe"
, parce que les parenthèses ne sont pas obligatoires. Est-ce beaucoup mieux? Eh bien, voici la partie cool: vous pouvez mettre dans les espaces et Ruby ne manquera pas un battement:
p1.name = "joe"
Maintenant, nous pouvons écrire et lire nos variables d'instance comme vous le souhaiteriez..
Mais ça va encore mieux. La définition de propriétés via des méthodes telles que celle-ci vous donne la possibilité de faire quelque chose avec la valeur que l'utilisateur de votre classe transmet, autrement que de l'attribuer à une variable d'instance, si cela convient à votre classe. Cependant, il est fort probable que la plupart du temps, vous fassiez ce que nous avons fait ici: il suffit de définir ou d'obtenir les variables d'instance. Dans ce cas, Ruby facilite encore plus les choses. Ajoutez simplement ceci en haut de votre classe:
attr_accessor: name,: age,: your_properties_here
Passer attr_accessor
les noms de vos propriétés sous forme de symboles. Cela crée le var
et var =
méthodes pour vous. Ensuite, vous pourrez utiliser le @
versions partout où vous avez besoin dans votre code.
Si vous voulez des propriétés en lecture seule ou en écriture seule, vous pouvez utiliser attr_reader
ou attr_writer
, respectivement. Bien sûr, si vous utilisez, disons, attr_writer
, vous pouvez ensuite créer une méthode de lecteur personnalisée si nécessaire.
Nous avons vu comment créer des méthodes d'instance; n'oubliez pas que vous pouvez utiliser ces valeurs de propriété si vous devez:
def greet "# @ name dit:" Bonjour! "" fin
Souvent, vous voudrez exécuter un code de configuration lorsqu’une instance d’une classe est créée. Ceci est fait dans une fonction constructeur. En Ruby, la fonction constructeur est nommée initialiser
. Pop ceci près du sommet de notre La personne
classe:
def initialize (nom, âge, emploi = 'sans emploi') @name = nom @age = age @job = fin du travail
Comme vous pouvez le constater, l’initialisation prend trois paramètres. Le troisième, emploi
, est optionnel, car nous lui avons donné une valeur par défaut. Bien sûr, cela fonctionne pour n'importe quelle fonction, pas seulement une fonction constructeur. Maintenant, lorsque nous voulons créer une instance de personne, nous devons procéder comme suit:
joe = Person.new ("Joe", 35 ans, "plombier") jill = Person.new "Jill", 14 ans
Les méthodes privées sont des fonctions qui ne peuvent être appelées que par d'autres fonctions de la classe; ils ne sont pas exposés au monde extérieur. La manière habituelle de créer des méthodes privées est la suivante: sous tout votre code public (les méthodes d'instance et de classe), ajoutez le mot clé privé
. Toutes les fonctions qui suivent ce mot clé sont privées.
# instance et méthodes de classe supérieures à private def get_real_weight @weight end end # de la classe
Si vous essayez d'appeler cette méthode sur une instance de La personne
, ça ne marchera pas.
Les méthodes et les propriétés de classe sont des fonctions et des variables qui ne sont pas accessibles à partir d'instances de classe, mais à partir de la classe elle-même. Par exemple, créons une méthode de classe qui retourne le nombre de La personne
cas nous avons créé.
Premièrement, nous devons créer une variable de classe qui contiendra le nombre de La personne
cas nous avons créé. Les variables de classe sont préfixées de deux at-signes. Alors, ajoutez ceci à votre classe, de préférence sous les lignes attr_ *:
@@ count = 0
Maintenant, chaque fois que nous faisons un nouveau La personne
, nous voulons incrémenter cette variable. Qu'est-ce qui se passe chaque fois que nous faisons un La personne
? initialiser
, bien sûr; alors mettez-le à jour en conséquence. Maintenant ça ressemble à ça:
def initialize (nom, âge, emploi = 'sans emploi') @nom = nom @age = âge @emploi = emploi @@ nombre + = 1 fin
Ensuite, bien sûr, nous devons créer la méthode de classe:
def self.count @@ count end
Maintenant, essayez ceci:
joe = Person.new ("Joe", 35, "plombier") jill = Person.new ("Jill", 13) bob = Personne.nouveau "Bob", 70 Person.count # => 3
Remarque - Ruby n'a pas vraiment de méthodes de classe (ni de méthodes statiques, comme certaines langues les appellent). Il y a en fait un peu de "magie" assez cool sous la surface qui fait que ces méthodes ressemblent à des méthodes de classe. Nous allons entrer dans cette métaprogrammation généralement appelée dans un chapitre à venir.
C'est tout pour aujourd'hui; Si vous avez des questions, faites le moi savoir dans les commentaires. La prochaine fois, nous explorerons de nombreuses méthodes communes sur les classes Ruby intégrées.
PS - Je joue avec les paramètres sonores de mon microphone. Le volume de ce screncast est-il suffisamment fort ou doit-il être plus élevé??