2011-11-02 12 views
6

Me falta algo acerca de cómo las personas hacen esto en Ruby.¿Cómo se accede a métodos de clases protegidos desde métodos de instancia en Ruby?

Si '#protected' es sin comentar obtenemos:
en 'qué': protected método 'ZOOP' llamó a Foo: Clase (NoMethodError)

¿Hay una mejor manera de acercarse a los métodos de clases protegidas?

class Foo 
    class << self 
    #protected 
    def zoop 
     "zoop" 
    end 
    end 
    public 
    def what 
    "it is '#{self.class.zoop}'" 
    end 
    protected 
end 

a = Foo.new 
p a.what # => "it is 'zoop'" 

me gustaría zoop a proteger o privada (sin llamada 'Foo.zoop'), pero hasta ahora, no puedo parecer encontrar una manera elegante.

+0

¿Hay una suposición subyacente de que las instancias de una clase deberían tener un acceso más íntimo a los métodos de singleton de la clase que otros objetos? –

+0

De hecho. Y bien dicho. –

Respuesta

2

Tras nuevas conversaciones con la calle: y DrBrain: en rubí-lang, resulta que mi impulso para guardar la memoria colocar funciones de utilidad en el nivel de clase estaba fuera de lugar.

En Ruby, los métodos de instancia cuelgan de la clase de todos modos, y la respuesta es continuar y colocar las funciones de la utilidad en el nivel de instancia como privadas.

En resumen, una función de utilidad que se accede únicamente por los métodos de instancia:

class Foo 
    def what 
    "it is '#{zoop}'" 
    end 
    private 
    def zoop 
    "zoop" 
    end 
end 

p Foo.new.what # => "it is 'zoop'" 

Para una función de utilidad que debe ser llamado desde los métodos de instancia y de clase, un módulo de anidado parecía haber un enfoque popular:

class Foo 
    module Util 
    def self.zoop 
     "zoop" 
    end 
    end 
    def what 
    "it is '#{Util.zoop}'" 
    end 
    class << self 
    def class_what 
     "for all time it is '#{Util.zoop}'" 
    end 
    end 
end 

p Foo.new.what # => "it is 'zoop'" 
p Foo.class_what # => "for all time it is 'zoop'" 
p Foo::Util.zoop # visible, alas 
2

Apenas importa que los métodos sean privados o estén protegidos en Ruby, ya que solo puede llamar a send() para evitarlos.

Si desea ZOOP a mantenerse protegido, el uso send() así:

def what 
    "it is '#{self.class.send(:zoop)}'" 
end 
Cuestiones relacionadas