2012-08-22 12 views

Respuesta

40

self siempre se refiere a una instancia, pero una clase es ella misma una instancia de Class. En ciertos contextos, self se referirá a dicha instancia.

class Hello 
    # We are inside the body of the class, so `self` 
    # refers to the current instance of `Class` 
    p self 

    def foo 
    # We are inside an instance method, so `self` 
    # refers to the current instance of `Hello` 
    return self 
    end 

    # This defines a class method, since `self` refers to `Hello` 
    def self.bar 
    return self 
    end 
end 

h = Hello.new 
p h.foo 
p Hello.bar 

de salida:

Hello 
#<Hello:0x7ffa68338190> 
Hello 
+1

Lamento no haber elegido este, pero ese primer '' p self' en realidad se ejecuta en el momento en que se analiza la definición de la clase. El 'h = Hello.new' en realidad devolvería el mismo valor que' h.foo'. Menciono esto en caso de que la salida de la lista pueda confundir a un nuevo Rubyista. – lilole

5

Dentro de un método de instancia de una clase self se refiere a esa instancia. Para obtener la clase dentro de una instancia, puede llamar al self.class. Si llamas al self dentro de un método de clase, obtienes la clase. Dentro de un método de clase no puedes acceder a ninguna instancia de la clase.

3

La referencia self está siempre disponible, y el objeto al que apunta depende del contexto.

class Example 

    self # refers to the Example class object 

    def instance_method 
    self # refers to the receiver of the :instance_method message 
    end 

end 
+0

no te olvides de los métodos de clase – ahnbizcad

2

el método self hace referencia al objeto al que pertenece. Las definiciones de clase también son objetos.

Si usa self dentro de la definición de clase, se refiere al objeto de la definición de clase (a la clase) si lo llama dentro del método de clase, vuelve a referirse a la clase.

Pero en el método de la instancia se refiere al objeto que es una instancia de la clase.

1.9.3p194 :145 >  class A 
1.9.3p194 :146?>   puts "%s %s %s"%[self.__id__, self, self.class] #1 
1.9.3p194 :147?>   def my_instance_method 
1.9.3p194 :148?>    puts "%s %s %s"%[self.__id__, self, self.class] #2 
1.9.3p194 :149?>    end 
1.9.3p194 :150?>   def self.my_class_method 
1.9.3p194 :151?>    puts "%s %s %s"%[self.__id__, self, self.class] #3 
1.9.3p194 :152?>   end 
1.9.3p194 :153?>  end 
85789490 A Class 
=> nil 
1.9.3p194 :154 > A.my_class_method #4 
85789490 A Class 
=> nil 
1.9.3p194 :155 > a=A.new 
=> #<A:0xacb348c> 
1.9.3p194 :156 > a.my_instance_method #5 
90544710 #<A:0xacb348c> A 
=> nil 
1.9.3p194 :157 > 

Usted ve puts # 1 que se ejecuta durante la declaración de clase. Muestra que class A es un objeto de tipo Clase con id == 85789490. Entonces, dentro de la declaración de clase, yo me refiero a la clase.

Entonces, cuando se invoca a los métodos de clase (n. ° 4) self el método de clase interna (n. ° 2) nuevamente se refiere a esa clase.

Y cuando se invoca un método de instancia (n. ° 5), se muestra que dentro de él (n. ° 3) self se refiere al objeto de la instancia de clase al que está asociado el método.

Si necesita hacer referencia a la clase dentro de un método de instancia utilizar self.class

1

puede ser que necesite: sí método?

1.itself => 1 
'1'.itself => '1' 
nil.itself => nil 

hope this help!

Cuestiones relacionadas