2012-08-22 7 views

risposta

40

self fa sempre riferimento a un'istanza, ma una classe è essa stessa un'istanza di Class. In determinati contesti self farà riferimento a tale istanza.

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 

uscita:

Hello 
#<Hello:0x7ffa68338190> 
Hello 
+1

Ci scusiamo per il nit pick su questo, ma quel primo 'p self' viene effettivamente eseguito nel momento in cui la definizione della classe viene analizzata. 'H = Hello.new' restituirebbe effettivamente lo stesso valore di' h.foo'. Ne parlo solo nel caso in cui l'output elencato possa fuorviare alcuni nuovi Rubyist. – lilole

5

Da un metodo di una classe self esempio si riferisce a tale istanza. Per ottenere la classe all'interno di un'istanza, è possibile chiamare self.class. Se chiami self all'interno di un metodo di classe, ottieni la classe. All'interno di un metodo di classe non puoi accedere ad alcuna istanza della classe.

3

Il riferimento self è sempre disponibile e l'oggetto a cui fa riferimento dipende dal contesto.

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

non dimenticare i metodi di classe – ahnbizcad

2

il metodo self fa riferimento all'oggetto a cui appartiene. Anche le definizioni di classe sono oggetti.

Se si utilizza self all'interno della definizione di classe si riferisce all'oggetto di definizione classe (alla classe) se lo si chiama nel metodo di classe si riferisce nuovamente alla classe.

Ma nel metodo di istanza si riferisce all'oggetto che è un'istanza della classe.

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 > 

Si vede il numero 1 che viene eseguito durante la dichiarazione della classe. Mostra che class A è un oggetto di tipo Classe con ID == 85789490. Quindi all'interno della dichiarazione di classe auto si riferisce alla classe.

Quindi quando viene invocato il metodo di classe (n. 4) il metodo self all'interno della classe (n. 2) si riferisce nuovamente a tale classe.

E quando viene invocato un metodo di istanza (n. 5), mostra che al suo interno (n. 3) self fa riferimento all'oggetto dell'istanza di classe a cui è collegato il metodo.

Se è necessario fare riferimento alla classe all'interno di un metodo di istanza utilizzare self.class

1

potrebbe essere necessario: metodo stesso?

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

spero che questo aiuto!

Problemi correlati