2009-01-07 14 views
13

Czy mogę utworzyć metodę instancji prywatnej, która może być wywoływana przez metodę klasy?Wywołanie metody instancji prywatnej z metody klasy w 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 

Przepraszam, jeśli jest to dość elementarne pytanie, ale nie byłem w stanie przetestować mojej metody rozwiązania.

+0

Należy naprawić swoje pytanie, masz literówkę. Czy metody nazywają się "bar" czy "plus"? – Samuel

+0

Masz rację - poprawisz. dzięki. – user4812

Odpowiedz

17

Używanie prywatnych lub chronionych naprawdę nie robi tak wiele w Ruby. Możesz wywołać send na dowolnym obiekcie i użyć dowolnej metody, którą posiada.

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

Można to zrobić jako Samuel pokazał, ale to jest naprawdę z pominięciem kontroli oo ...

W Ruby można wysyłać prywatnych metod tylko na tym samym obiekcie i chronione jedynie do obiektów tego samego klasa. Metody statyczne znajdują się w klasie meta, więc znajdują się w innym obiekcie (a także w innej klasie) - więc nie można tego zrobić tak, jak chciałbyś użyć prywatnego lub chronionego.

6

Można również użyć instance_eval

class Foo 
    def self.bar(my_instance, n) 
    my_instance.instance_eval { plus(n) } 
    end 
end 
Powiązane problemy