programacion objetos metodos manejo lista importar herencia ejemplos ejemplo clases clase ruby oop access-specifier

objetos - Llamar a un método de instancia privada desde un método de clase en Ruby



manejo de objetos en ruby (3)

¿Puedo crear un método de instancia privado que pueda ser llamado por un método de clase?

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

Disculpe si esta es una pregunta bastante elemental, pero no he podido buscar la solución a Google.


Puedes hacerlo como lo demostró Samuel, pero en realidad está pasando por alto los controles OO ...

En Ruby, puede enviar métodos privados solo en el mismo objeto y protegerlos solo para 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.


Usar 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


También puedes usar instance_eval

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