/ / Utilisation de attr_reader avec une méthode privée de la même instance var name - ruby

Utilisation de attr_reader avec une méthode privée de la même instance var name - ruby

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 № 1

Si 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.