2009-01-07 46 views
13

Tôi có thể tạo phương thức cá thể riêng có thể được gọi bằng phương thức lớp không?Gọi phương thức cá thể riêng từ phương thức lớp trong Ruby

class Foo 
    def initialize(n) 
    @n = n 
    end 
    private # or protected? 
    def plus(n) 
    @n += n 
    end 
end 

class Foo 
    def Foo.bar(my_instance, n) 
    my_instance.plus(n) 
    end 
end 

a = Foo.new(5) 
a.plus(3) # This should not be allowed, but 
Foo.bar(a, 3) # I want to allow this 

Xin lỗi nếu đây là câu hỏi khá cơ bản, nhưng tôi chưa thể tìm được giải pháp cho Google.

+0

Bạn nên sửa câu hỏi của bạn, bạn có một lỗi đánh máy. Các phương pháp được gọi là thanh hoặc cộng? – Samuel

+0

bạn nói đúng - sẽ sửa. cảm ơn. – user4812

Trả lời

17

Sử dụng riêng tư hoặc được bảo vệ thực sự không làm được gì nhiều trong Ruby. Bạn có thể gọi gửi trên bất kỳ đối tượng nào và sử dụng bất kỳ phương thức nào nó có.

class Foo 
    def Foo.bar(my_instance, n) 
    my_instance.send(:plus, n) 
    end 
end 
9

Bạn có thể làm điều đó như Samuel thấy, nhưng nó thực sự là bỏ qua các kiểm tra OO ...

Trong Ruby bạn có thể gửi các phương pháp tư nhân chỉ trên cùng một đối tượng và bảo vệ chỉ để đối tượng của cùng một lớp học. Các phương thức tĩnh nằm trong một lớp meta, vì vậy chúng nằm trong một đối tượng khác (và cũng là một lớp khác) - vì vậy bạn không thể làm như bạn muốn bằng cách sử dụng riêng tư hoặc được bảo vệ.

6

Bạn cũng có thể sử dụng instance_eval

class Foo 
    def self.bar(my_instance, n) 
    my_instance.instance_eval { plus(n) } 
    end 
end 
Các vấn đề liên quan