tôi có thể làm attr_reader
(và attr_writer
và attr_accessor
liên quan) phương pháp (s) tin bằng cách đặt các tuyên bố trong một phần private
:Tại sao phương thức được ủy quyền là công khai khi được khai báo trong phần riêng tư?
class Foo
private
attr_reader :b
end
Foo.new.b # => NoMethodError: private method `b' called for #<Foo:>
Tuy nhiên, Rails' delegate
và tiêu chuẩn thư viện của def_delegate
của Ruby không làm việc này đường. Các phương thức được ủy quyền này luôn công khai.
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"
Làm cho riêng phái đoàn có thể dễ dàng thực hiện bằng cách thay đổi nó để:
private def_delegator :foo, :b
nhưng tôi mong đợi một lỗi NoMethodError
cho Bar.new.b
trên. Tại sao đoàn không phải là cá nhân?
Định nghĩa phương pháp def_delegator
(bí danh cho def_instance_delegator
) chỉ là rescue
(khối loại bỏ):
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
Điều đó có nghĩa module_eval
không tôn trọng điều đó nó được gọi trong một phần private
. Tại sao?