/ / Usando attr_reader com um método privado da mesma instância var name - ruby

Usando attr_reader com um método privado da mesma instância var name - ruby

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

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