2009-06-08 13 views
26

Domanda rapida sull'uso di "SELF" all'interno di un modulo o di una libreria. Fondamentalmente qual è lo scopo/contesto di "SELF" in quanto riguarda un modulo o una libreria e come deve essere usato correttamente? Per un esempio di ciò di cui sto parlando, controlla il modulo "AuthenticatedSystem" installato con "restful_authentication".(Ruby, Rails) Contesto di SELF in moduli e librerie ...?

NOTA: sono consapevole che "sé" equivale a "questo" in altri linguaggi e in che modo "self" opera su una classe/oggetto, tuttavia nel contesto di un modulo/libreria non c'è nulla per "sé" . Allora, qual è il contesto di sé all'interno di qualcosa come un modulo in cui non esiste una classe?

risposta

44

In un modulo:

Quando si vede self in un metodo di istanza, si riferisce al caso di la classe in cui è incluso il modulo.

Quando si visualizza self al di fuori di un metodo di istanza, fa riferimento al modulo.

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. Tutto è un oggetto in Ruby. Non esiste un codice luogo che possa essere eseguito dove non c'è un sé. – Chuck

+0

Capito, quindi qual è lo scopo/scopo della chiamata di sé in un modulo? –

+0

Ciao tutti, Ancora in cerca di una risposta esplicita. Mi rendo conto di ciò che SELF * può * fare. Quello che devo sapere è esattamente ciò che * fa * fa in una funzione di un modulo? Direi che un certo tipo di variabile è impostato a livello globale, ma non sono sicuro se questo è il caso. Qualcuno può confermare/chiarire? –

0

Per una breve sintesi ... http://paulbarry.com/articles/2008/04/17/the-rules-of-ruby-self

sé è utilizzato anche per aggiungere metodi di classe (o metodi statici per le persone C#/Java). Il seguente frammento è l'aggiunta di un metodo chiamato fai_qualcosa all'oggetto classe corrente (statica) ...

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