2009-06-08 15 views
26

Pregunta rápida sobre el uso de "SELF" dentro de un módulo o biblioteca. Básicamente, ¿cuál es el alcance/contexto de "SELF" en lo que respecta a un módulo o biblioteca y cómo se usa correctamente? Para ver un ejemplo de lo que estoy hablando, consulte el módulo "AuthenticatedSystem" instalado con "restful_authentication".(Ruby, Rails) Contexto de SELF en módulos y bibliotecas ...?

NOTA: Soy consciente de que 'self' equivale a 'esto' en otros idiomas y cómo funciona 'self' en una clase/objeto, sin embargo, en el contexto de un módulo/biblioteca no hay nada para 'self' . Entonces, ¿cuál es el contexto del yo dentro de algo así como un módulo donde no hay clase?

Respuesta

44

En un módulo:

Cuando vea self en un método de instancia, se refiere a la instancia de la clase en la que se incluye el módulo

Cuando vea self fuera de un método de instancia, se refiere al módulo.

module Foo 
    def a 
    puts "a: I am a #{self.class.name}" 
    end 

    def Foo.b 
    puts "b: I am a #{self.class.name}" 
    end 

    def self.c 
    puts "c: I am a #{self.class.name}" 
    end 
end 

class Bar 
    include Foo 

    def try_it 
    a 
    Foo.b # Bar.b undefined 
    Foo.C# Bar.c undefined 
    end 
end 

Bar.new.try_it 
#>> a: I am a Bar 
#>> b: I am a Module 
#>> c: I am a Module 
+1

Precisamente. Todo es un objeto en Ruby. No hay lugar donde se puede ejecutar el código donde no hay un yo. – Chuck

+0

Entendido, entonces, ¿cuál es el alcance/propósito de llamar a uno mismo en un módulo? –

+0

Hola a todos, Todavía estoy buscando una respuesta explícita. Me doy cuenta de lo que SELF * puede * hacer. Lo que necesito saber es exactamente lo que * does * do en una función de un módulo? Supongo que algún tipo de variable se establece globalmente, pero no estoy seguro si este es el caso. ¿Alguien puede confirmar/iluminar? –

0

Para un breve resumen ... http://paulbarry.com/articles/2008/04/17/the-rules-of-ruby-self

auto también se utiliza para agregar métodos de clase (o métodos estáticos para las personas C#/Java). El siguiente fragmento es la adición de un método llamado hacer_algo a la clase de objeto actual (estático) ...

class MyClass 
    def self.do_something # class method 
     # something 
    end 
    def do_something_else # instance method 
    end 
end 
Cuestiones relacionadas