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