/ / Używanie attr_reader z prywatną metodą o tej samej instancji var name - ruby

Używanie attr_reader z prywatną metodą tej samej instancji var name - ruby

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

Jeś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.