2010-07-28 9 views
13

In quale tipo di situazione è il codice:moduli rubino ed estendere autonomi

module M 
    extend self 
    def greet 
    puts "hello" 
    end 

end 

più vantaggioso utilizzare più dire qualcosa come:

module M 
    def self.greet 
    puts "hello" 
    end 
end 

Nella parte superiore, uno è un essere metodo di istanza esteso, e il secondo è solo un metodo di classe, ma quando si chiama entrambi i metodi, dovresti M.greet, giusto? Ero solo curioso di sapere se qualcuno potesse far luce su quando usare un codice sull'altro. Grazie!

risposta

13

Il primo esempio è in genere un modo di ottenere la funzionalità di module_function (quando non conoscono l'esistenza di questo metodo).

Un module_function è sia un metodo di istanza e un metodo di classe. Nel tuo secondo esempio di codice, il metodo è solo un metodo di classe.

+0

Oh, questo è un metodo interessante. In questo modo è possibile selezionare i metodi per dare la funzionalità per nel caso in cui non si vuole dare a tutti loro. Grazie! – joeellis

9

Sarebbe possibile fare questo con il primo esempio, ma non il secondo:

include M 
greet 
2

Un modulo può essere utilizzato come spazio scrivendo metodi moduli, e metodi di istanza di un modulo può essere miscelato in un altro oggetto.

Il concetto di modulo autoestinguente consente di utilizzare un modulo in entrambi i modi; come spazio dei nomi autonomo o come mixin. Considerate questo modulo:

module M 
    def bar 
    puts "bar" 
    end 
end 
class C 
    include M 
end 

Ha un metodo di istanza e può essere miscelato in un altro oggetto. Non ha un metodo di modulo e non può quindi essere utilizzato come uno spazio dei nomi:

puts M::bar # => undefined method `bar' for M:Module 
puts C.bar # => this is bar 

Ma, un modulo è un solo un oggetto della classe Module, come possiamo dimostrare

puts M.class # => Module 

Questo significa che possiamo fare qualcosa di pazzo. Possiamo mescolare un modulo in se stesso in modo che i suoi metodi diventino entrambi i metodi di istanza e modulo.

module M 
    extend self 
    def bar 
    puts "bar" 
    end 
end 
puts M::bar # => this is bar 
puts C.bar # => this is bar