Puedo crear una instancia privada método que puede 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

Disculpas si esta es una muy elemental pregunta, pero no he sido capaz de Google en mi camino a una solución.

  • Usted debe fijar su pregunta, usted tiene una errata. Son los métodos que se llama bar o plus?
  • tienes razón – va a arreglarlo. gracias.
InformationsquelleAutor user4812 | 2009-01-07

3 Comentarios

  1. 18

    Uso privado o protegido realmente no hacen mucho en Ruby. Usted puede llamar a enviar en cualquier objeto y utilizar cualquier método que tiene.

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

    Usted puede hacer como Samuel mostró, pero es realmente evitando el OO cheques…

    En Ruby puede enviar privado métodos sólo en el mismo objeto y protegido sólo a los objetos de la misma clase. Métodos estáticos residen en una meta de la clase, por lo que están en un objeto diferente (y también una clase diferente) – así que no puedes hacer lo que te gustaría usar, ya sea privado o protegido.

  3. 7

    Usted podría también utilizar instance_eval

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

Dejar respuesta

Please enter your comment!
Please enter your name here