posso fare attr_reader
(e il relativo attr_writer
e attr_accessor
) il metodo (s) privata mettendo la dichiarazione in una sezione private
:Perché un metodo delegato è pubblico quando dichiarato in una sezione privata?
class Foo
private
attr_reader :b
end
Foo.new.b # => NoMethodError: private method `b' called for #<Foo:>
Tuttavia, delegate
e del def_delegate
libreria standard di Ruby non funzionano questo Rails' modo. Questi metodi delegati sono sempre pubblici.
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"
Rendere il privato delegazione è fatto facilmente cambiando a:
private def_delegator :foo, :b
ma mi aspettavo un errore di NoMethodError
per Bar.new.b
sopra. Perché la delegazione non è privata?
La definizione del metodo di def_delegator
(alias def_instance_delegator
) copre soli rescue
(blocchi rimossi):
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
Ciò significa module_eval
non rispetta che è stato chiamato in una sezione private
. Perché?