Acabei de encontrar um caso de uso em que temos uma classe com uma variável de instância @errors
que é memorizado via método privado com o mesmo nome.
class Foo
attr_reader :errors
private
# memoized method
def errors
@errors ||= []
end
end
f = Foo.new
# private method `errors" called for #<Foo:...
f.errors
Qual é a solução aqui? Usar #instance_variable_get
ou renomear o atributo ou método?
Respostas:
0 para resposta № 1Se você realmente deseja manter o método do leitor privado, pode usar method_missing
para redirecionar as chamadas para errors
dentro da sua classe. Por exemplo:
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 # => []
No entanto, como o @SergioTulentsev postou nos comentários, isso pode adicionar complexidade ao seu código, especialmente quando a classe já é muito grande.