2009-01-07 16 views
13

¿Puedo crear un método de instancia privado que pueda ser llamado por un método de clase?Llamar a un método de instancia privada desde un método de clase 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 

Disculpas si esto es una pregunta bastante elemental, pero no he podido Google mi camino a una solución.

+0

Usted debe fijar su pregunta, usted tiene un error tipográfico. ¿Los métodos se llaman barra o más? – Samuel

+0

tienes razón, lo arreglaré. Gracias. – user4812

Respuesta

17

El uso privado o protegido realmente no hace tanto en Ruby. Puede llamar enviar en cualquier objeto y utilizar cualquier método que tenga.

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

Puede hacerlo como mostró Samuel, pero está realmente pasando por alto los controles OO ...

en Ruby puede enviar métodos privados sólo en el mismo objeto y protegido únicamente a objetos de la misma clase. Los métodos estáticos residen en una metaclase, por lo que están en un objeto diferente (y también en una clase diferente), por lo que no puede hacer lo que quiera con privacidad o protección.

6

También es posible usar instance_eval

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