Właśnie spotkałem przypadek użycia, w którym mamy klasę ze zmienną instancji @errors
które są zapamiętywane za pomocą prywatnej metody o tej samej nazwie.
class Foo
attr_reader :errors
private
# memoized method
def errors
@errors ||= []
end
end
f = Foo.new
# private method `errors" called for #<Foo:...
f.errors
Jakie jest tutaj rozwiązanie? Posługiwać się #instance_variable_get
lub zmienić nazwę atrybutu lub metody?
Odpowiedzi:
0 dla odpowiedzi № 1Jeśli naprawdę chcesz zachować prywatność metody czytnika, możesz użyć method_missing
przekierowywać połączenia na errors
w twojej klasie. Na przykład:
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 # => []
Jednak, jak napisał @SergioTulentsev w komentarzach, może to zwiększyć złożoność twojego kodu, szczególnie gdy klasa jest już bardzo duża.