Ruby 3.0. Ruby et les méthodes moins connues de contrôle de la vie privée
Tomasz Szkaradek
Architecte de développement
L'une des caractéristiques les plus appréciées de Ruby est sa syntaxe très flexible. Personnellement, j'aime Ruby pour les nombreuses possibilités qu'il offre dans la définition des classes et de leurs propriétés, et c'est ce dont je vais parler dans cet article.
Solutions de base
Supposons que nous utilisions la classe Foo qui possède une méthode publique et une méthode privée :
classe Foo
def bar
:awesome
end
privé
def baz
:something_private
end
end
Tout va bien, nous voyons une telle solution dans pratiquement tous les pays de l'Union européenne. projet. Courir Foo.new.baz provoquera l'erreur NoMethodError (méthode privée 'baz' appelée pour # ) et c'est ce que nous voulions faire. Que se passe-t-il si nous essayons de modifier le format d'enregistrement et d'ajouter private comme préfixe dans la définition de la classe ?
classe Foo
def bar
:awesome
end
private def baz
:something_private
end
end
Comme vous pouvez le constater après avoir exécuté le codemais cela fonctionne réellement ! Pourquoi pouvons-nous saisir la visibilité de la méthode avant de l'exécuter ? Parce que lors de la définition d'une méthode, def renvoie le nom de la méthode sous forme de symbole. Cette expression n'est pas seulement une partie de la syntaxe, mais de facto une méthode dérivée de la classe Module et traitant ce symbole comme un argument. Pour plus d'informations, veuillez consulter la documentation dans ce lien. Puisque nous avons commencé si facilement avec private, essayons de changer la visibilité de la méthode private.
classe Foo
def bar
:awesome
end
private def baz
:something_private
end
public :baz
end
Succès ! Notre méthode de bases est devenue publique car nous l'avons rendue visible deux fois. Bien entendu, la même opération s'applique aux modules. C'est très bien, mais où cela nous mène-t-il ? Cette fonctionnalité nous apporte beaucoup car nous pouvons librement modifier la visibilité d'une méthode lors de sa définition, ou même modifier la visibilité des méthodes lors de leur héritage.
Voyons maintenant ce que Ruby 2.7 peut faire pour modifier la visibilité des alias et des accesseurs.
classe Foo
private attr_accessor :awesome_variable
fin
Malheureusement, nous obtenons une erreur, car la méthode privée attend des symboles et attr_accessor. Le code renvoie nil et cette méthode n'est donc pas compatible avec l'utilisation de private dans Ruby 2.7. Quelles sont donc nos options ?
Nous pouvons utiliser attr_accessor sous le mot-clé private pour que cela fonctionne, c'est-à-dire que nous obtiendrons une erreur lorsque nous voudrons faire référence à l'élément awesome_variableawesome_variable méthode.
classe Foo
privé
attr_accessor :awesome_variable
fin
La seconde option consiste à exécuter la méthode privée sur les méthodes générées par attr_attribut; dans ce cas, nous devons également nous rappeler d'entrer le setter à cet endroit.
classe Foo
attr_accessor :awesome_variable
private :awesome_variable, :awesome_variable=
fin
Problèmes liés à la attr_ * ne sont pas les seuls obstacles. Nous pouvons rencontrer la même difficulté lorsque nous voulons créer un alias privé.
classe Foo
private alias :bar, :awesome_bar
fin
Ruby 3.0 et nos activités
Heureusement, Ruby 3.0 introduit un grand changement puisque les méthodes de visibilité peuvent prendre un tableau en argument et les méthodes alias, attr_ *, peuvent réinitialiser le tableau avec les noms des méthodes qui ont été définies. Pour en savoir plus ici.
Maintenant, voyons quelques exemples dans la dernière version de l'euba et vérifions si les changements ont été effectués et comment nous pouvons les utiliser. Dans le premier exemple, nous utilisons private avant l'accesseur attr :
classe Foo
private attr_accessor :awesome_variable
fin
Un tel appel ne provoquera pas d'erreurs dans l'analyse de la syntaxe et, ce qui est important, la fonction Variable géniale etawesome_variable =deviennent privées. La méthode alias fait la même chose, mais elle renvoie également un symbole comme nom de la nouvelle méthode et la rend visible.
classe Foo
private alias :bar, :awesome_bar
fin
Il est intéressant de noter que nous pouvons également approfondir d'autres méthodes, par exemple l'impressionnante méthodeLe module d'impression peut être appelé entre private et attrIl est important qu'une telle méthode renvoie un tableau contenant les noms des méthodes qui se trouvent du côté droit de l'expression.
classe Module
def awesome_print(names)
met les noms
noms
fin
fin
classe Foo
private awesome_print attr_reader :awesome_bar
fin
Résumé
J'espère que cet article vous sera utile ! En cas de nouvelles sur Ruby 3.0. lire la suite ici.