2009-01-07 5 views
13

Puis-je créer une méthode d'instance privée qui peut être appelée par une méthode de classe?L'appel d'une méthode d'instance privée à partir d'une méthode de classe en 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 

Toutes mes excuses si cela est une question assez élémentaire, mais je n'ai pas pu Google mon chemin à une solution.

+0

Vous devriez fixer votre question, vous avez une faute de frappe. Les méthodes sont-elles appelées bar ou plus? – Samuel

+0

vous avez raison - corrigera. Merci. – user4812

Répondre

17

L'utilisation privée ou protégée vraiment ne pas faire beaucoup en Ruby. Vous pouvez appeler envoyer sur un objet et utiliser toute méthode qu'il a.

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

Vous pouvez le faire comme Samuel a montré, mais il est vraiment court-circuitant les contrôles OO ...

En Ruby, vous pouvez envoyer des méthodes privées que sur le même objet et protégé uniquement aux objets du même classe. Les méthodes statiques résident dans une classe méta, ils sont dans un autre objet (et une autre classe) - de sorte que vous ne pouvez pas faire que vous le souhaitez en utilisant soit privé ou protégé.

6

Vous pouvez également utiliser instance_eval

class Foo 
    def self.bar(my_instance, n) 
    my_instance.instance_eval { plus(n) } 
    end 
end 
Questions connexes