Question attr vs attr_accessor


Dans Ruby, il existe quatre méthodes getter et setter différentes pour les variables d’instance, attr, attr_reader, attr_writer, et attr_accessor. La question est, est en Ruby attr :dilithium, le même que attr_reader :dilithium, et identique à attr_accessor :dilithium si un paramètre supplémentaire true est passé? C'est à dire est

class Enterprise
  attr :dilithium, true

identique à

class Enterprise
  attr_accessor :dilithium

Sont les deux fonctions attr et attr_accessor plus ou moins redondant?


20
2017-12-19 17:42


origine


Réponses:


Une différence est que attr_accessor et les amis sont plus clairs, et l'argument booléen facultatif à attr est maintenant obsolète. En dehors de cela, et le fait que attr n'a pas de documentation, il n'y a pas de réelle différence.


27
2017-12-19 17:45



Dans Ruby 1.8, attr ne peut définir qu'un seul attribut, avec une option true pour créer un setter. En 1.9, il se comporte comme attr_reader: il permet plusieurs attributs. Comme @Linuxios le dit, le booléen optionnel est obsolète.


6
2017-12-19 18:13



Si vous regardez le code C dans Ruby 2.3.0, vous verrez que attr et attr_reader font réellement la même chose (sauf pour le chemin de code obsolète). Ce sont essentiellement des fonctions équivalentes.

Pour moi, les principales différences sont les suivantes:

attr est un peu plus facile à écrire car il est plus court. J'aime la façon dont cela se ressent dans le contexte de la programmation fonctionnelle / immuable (dans ces contextes, attr_writer et attr_accessor ne sont pas pertinents et utilisent donc attr_reader se sent verbeux et redondant).

attr avec plusieurs variables d’instance, il est difficile de documenter, sauf dans des situations très spécifiques, par ex.

# The coordinates in WGS84.
attr :x, :y

# The location name.
attr :name

# The popularity of the location.
attr :popularity

Il serait plus difficile de documenter :name et :popularity indépendamment s'ils étaient sur la même ligne attr :name, :popularity.

En dehors de cela, cela se résume à des préférences personnelles. Il n'y a en pratique aucune différence de performance ni aucune autre différence.


1
2017-07-02 08:39