mogę attr_reader
(a attr_writer
i attr_accessor
pokrewne) metodę (-y) prywatny poprzez umieszczenie oświadczenia w private
odcinku:Dlaczego jest to metoda delegowany publiczny gdy zadeklarowana w sekcji prywatnej?
class Foo
private
attr_reader :b
end
Foo.new.b # => NoMethodError: private method `b' called for #<Foo:>
Jednak delegate
i Ruby standardowe biblioteki def_delegate
nie działają Rails' to droga. Te delegowane metody są zawsze publiczne.
class Foo
attr_reader :b
def initialize
@b = 'b'
end
end
require 'forwardable'
class Bar
attr_reader :foo
def initialize
@foo = Foo.new
end
extend Forwardable
private
def_delegator :foo, :b
end
Bar.new.b # => "b"
Making prywatnej delegowania jest łatwo zrobić, zmieniając go do:
private def_delegator :foo, :b
ale spodziewałem się błąd NoMethodError
dla Bar.new.b
powyżej. Dlaczego delegacja nie jest prywatna?
Definicja Sposób def_delegator
(alias dla def_instance_delegator
) znajduje się w odległości rescue
(bloki usunięto):
def def_instance_delegator(accessor, method, ali = method)
line_no = __LINE__; str = %Q{
def #{ali}(*args, &block)
#{accessor}.__send__(:#{method}, *args, &block)
end
}
module_eval(str, __FILE__, line_no)
end
module_eval
Oznacza to, że nie uznaje, że został on zwany w przekroju private
. Czemu?