Ruby for Newbies les opérateurs et leurs méthodes

Ruby est l’un des langages les plus utilisés sur le Web. Nous avons lancé une nouvelle série de screencast ici sur Nettuts + qui vous présentera Ruby, ainsi que les formidables cadres et outils associés au développement de Ruby. Dans cette leçon, nous allons examiner de plus près les opérateurs de Ruby et expliquer pourquoi ils sont différents de tout ce que vous avez vu auparavant..


Les opérateurs

Vous connaissez les opérateurs.

1 + 2 # 3 personne [: name] = "Joe"

Les opérateurs sont des éléments tels que le signe plus (l'un des opérateurs arithmétiques) ou le signe égal (l'opérateur d'attribution). Ces éléments ne semblent pas très différents de ceux que vous utilisez en JavaScript, PHP ou tout autre langage. Mais comme la plupart des rubis, il y a bien plus que ce que l'on voit ici.

Voici le secret: les opérateurs de Ruby sont vraiment des appels de méthode. Essaye ça:

1. + (2) # 3

Ici, nous appelons le + opérateur sur l'objet 1, passant dans l'objet 2 en paramètre. On récupère l'objet 3. Nous pouvons aussi le faire avec des chaînes:

name = "Joe" name. + ("Smith") # "Joe Smith", mais 'name' est toujours "Joe" name + = "Smith" # nom est maintenant "Joe Smith"

Comme vous pouvez le constater, nous pouvons effectuer une concaténation de chaînes avec le + méthode. En bonus, ruby ​​définit l'opérateur + = en fonction de l'opérateur + (remarque: vous ne pouvez pas utiliser + = comme méthode)..

Comme vous pouvez vous en rendre compte, cela nous donne un pouvoir incroyable. Nous pouvons personnaliser la signification de l'ajout, de la soustraction et de l'affectation d'objets dans nos classes personnalisées. Nous avons vu comment cela fonctionne avec les propriétés sur les objets dans notre leçon sur les classes (nous avons défini un propriété et propriété = méthode dans la classe et a obtenu le sucre de syntaxe attendu pour les utiliser). Ce que nous examinons ici, nous allons encore plus loin..


Construire nos propres méthodes d'opérateur

Essayons de créer l'une de ces méthodes nous-mêmes. Pour cet exemple, créons un objet réfrigérateur, auquel nous pouvons ajouter des éléments via le + opérateur et sortir les choses de via le - opérateur.

Voici le début de notre cours:

classe Fridge def initialize (boissons = [], aliments = []) @ boissons = boissons @foods = aliments fin def + (article) fin def - (article) fin fin

Notre initialiser function est assez simple: nous prenons deux paramètres (qui retournent à des tableaux vides si rien n’est donné), et les affectons à des variables d’instance. Maintenant, construisons ces deux fonctions:

def + (item) si item.is_a? Beverage @ beverages.push Article autre @ foods.push Article final

C'est assez simple. Chaque objet a un est un? méthode qui prend un seul paramètre: une classe. Si l'objet est une instance de cette classe, il retournera true; sinon, il retournera faux. Donc, cela dit que si l'article que nous ajoutons au réfrigérateur est un Boisson, nous l'ajouterons à la bières tableau. Sinon, nous l'ajouterons à la @aliments tableau.

C'est bon; maintenant, que diriez-vous de prendre des choses dans le réfrigérateur? (Remarque: cette méthode est différente de celle présentée dans la vidéo. Cela montre que ces méthodes d'opérateurs nous offrent une grande flexibilité; ce sont des méthodes tout à fait normales avec lesquelles vous pouvez faire n'importe quoi. Aussi, je pense que c'est une meilleure version de la méthode, mais elle est plus complexe)

def - (item) ret = @ beverages.find do | beverage | beverage.name.downcase == item.downcase end return @ beverages.delete ret sauf si ret.nil? ret = @ foods.find do | food | food.name.downcase == item.downcase end @ foods.delete ret end

Voici ce qui se passe lorsque nous utilisons l'opérateur moins. Le paramètre qu’il prend est une chaîne, avec le nom de l’élément recherché (Au fait, nous allons créer le Boisson et Aliments classes bientôt). Nous commençons par utiliser le trouver méthode que les tableaux ont. Il y a plusieurs façons d'utiliser cette méthode. nous passons un bloc; ce bloc dit que nous essayons de trouver l'élément dans le tableau qui a un prénom propriété identique à la chaîne que nous avons transmise; notez que nous convertissons les deux chaînes en minuscules, par sécurité.

S'il y a un élément qui correspond dans le tableau, il sera stocké dans ret; autrement, ret sera néant. Ensuite, nous allons retourner le résultat de @ beverage.delete ret, qui supprime l’élément du tableau et le renvoie. Notez que nous utilisons un modificateur d'instruction à la fin de cette ligne: nous le faisons sauf si ret est néant.

Vous pourriez vous demander pourquoi nous utilisons le mot clé revenir ici, puisque ce n’est pas nécessaire en Ruby. Si nous ne l'utilisions pas ici, la fonction ne reviendrait pas encore car il y avait plus de code dans la fonction. En utilisant revenir ici nous permet de renvoyer une valeur d'un endroit où la fonction ne reviendrait pas normalement.

Si nous ne revenons pas, cela signifie que l'élément n'a pas été trouvé dans bières. Par conséquent, nous supposerons que c'est dans @nourriture. Nous ferons la même chose pour trouver l'article dans @nourriture et ensuite le retourner.

Avant de tester cela, nous aurons besoin de notre Aliments et Boissons Des classes:

classe Boisson attr_accessor: nom def initialise nom @name = nom @ heure = Heure.aujourd'hui fin à la classe Alimentaire attr_accesseur: nom def initialise nom @ nom = nom @ heure = Heure.aujourd'hui fin à la fin

Notez que dans la vidéo, je n'ai pas fait @prénom accessible de l'extérieur de l'objet. Ici, je fais ça avec attr_accessor: nom, afin que nous puissions vérifier le nom de ces objets quand ils sont à l'intérieur d'un réfrigérateur.

Alors testons-le dans irb; nous commencerons par exiger le fichier contenant le code; Ensuite, essayez les classes. notez que j'ai ajouté des sauts de ligne à la sortie pour faciliter la lecture.

> require './lesson_6' => true> f = Fridge.new => # > f + Beverage.new ("water") => [#]> f + Food.new ("bread") => [#]> f + Food.new ("egg") => [#, # ]> f + Beverage.new ("jus d’orange") => [#, # ]> f => #, # ], nourriture[ #, # ]> f - "pain" => # > f => #, #], nourriture[#]

Au fur et à mesure, vous pouvez voir des choses ajoutées au bières et @nourriture tableaux, puis supprimés par la suite.


Opérateurs Get et Set

Écrivons maintenant des méthodes pour les opérateurs get et set utilisés avec des hachages. Vous avez déjà vu ça:

personne =  personne [: nom] = "Joe"

Mais, puisque ces opérateurs sont des méthodes, nous pouvons le faire de cette façon:

personne. [] = (: age, 35) # pour définir la personne. [] (: nom) # pour obtenir

C'est vrai; ce sont des méthodes normales, avec du sucre spécial pour votre usage.

Essayons ceci. nous ferons un club classe. Notre club a des membres avec des rôles différents. Cependant, nous pouvons vouloir avoir plus d'un membre avec un rôle donné. Donc notre club instance gardera une trace des membres et de leurs rôles avec un hachage. Si nous essayons d'affecter un second membre à un rôle, au lieu de remplacer le premier, nous l'ajouterons..

class Club def initialize @members =  end def [] (rôle) @members [rôle] end def [] = (rôle, membre) end end

La version get est assez simple. nous venons de le transmettre au @membres tableau. Mais le set est un peu plus compliqué:

def [] == (rôle, membre) si @members [rôle] .nil? @members [rôle] = membre elsif @members [rôle] .is_a? String @members [rôle] = [@members [rôle], membre] else @members [rôle] .push membre end end

Si ce rôle n'a pas été défini, nous allons simplement définir la valeur de cette clé pour le hash de nos membres. S'il a été défini en tant que chaîne, nous voulons convertir cela en un tableau et placer le membre d'origine et le nouveau membre dans ce tableau. Enfin, si aucune de ces options n'est vraie, il s'agit déjà d'un tableau. Nous insérons donc le membre dans le tableau. Nous pouvons tester cette classe de cette façon:

c = Club.new c [: chair] = "Joe" c [: ingénieur] = "John" c [: ingénieur] = "Sue" c [: président] # "Joe" c [: engingeer] # ["John ", "Poursuivre en justice" ]

Voilà!


Autres opérateurs

Ce ne sont pas les seuls opérateurs avec lesquels nous pouvons faire cela, bien sûr. Voici la liste complète:

  • Opérateurs arithmétiques: + - * \
  • Opérateurs Get et Set: [] [] =
  • Opérateur de pelle: <<
  • Opérateurs de comparaison: == < > <= >=
  • Egalité de cas Opérateur: ===
  • Opérateur binaire: | & ^

Merci d'avoir lu!

Si vous avez des questions sur cette leçon ou sur tout autre sujet dont nous avons discuté dans Ruby, demandez-le dans les commentaires.!