Je viens de rencontrer un cas d'utilisation où nous avons une classe avec une variable d'instance @errors
qui est mémorisé via une méthode privée du même nom.
class Foo
attr_reader :errors
private
# memoized method
def errors
@errors ||= []
end
end
f = Foo.new
# private method `errors" called for #<Foo:...
f.errors
Quelle est la solution ici? Utilisation #instance_variable_get
ou renommer l'attribut ou la méthode?
Réponses:
0 pour la réponse № 1Si vous voulez vraiment garder la méthode de lecture privée, vous pouvez utiliser method_missing
rediriger les appels vers errors
dans votre classe. Par exemple:
class Foo
attr_reader :errors
# Add method_missing here
def method_missing(method_name, *args, &block)
if method_name.to_s == "errors"
errors
else
super
end
end
private
# memoized method
def errors
@errors ||= []
end
end
f = Foo.new
puts f.errors.to_s # => []
Toutefois, comme @SergioTulentsev l'a publié dans des commentaires, cela pourrait ajouter de la complexité à votre code, en particulier lorsque la classe est déjà très volumineuse.