2011-04-01 10 views
13
class Foo 

    def self.one; 1 end 

    class << self 
    def two; 2 end 
    end 

end 
puts Foo.singleton_methods.inspect # => ["two", "one"] 

Mi è stato detto che i metodi "uno" e "due" sono concettualmente diversi ma non vedo come. Sono entrambi metodi singleton: qual è la differenza di concetto e anche di applicazione?in ruby ​​qual è la differenza tra self.method e un metodo all'interno della classe << self

+1

+1. Che dire di 'module_function'? Mi interessa sapere anche la differenza. – sawa

risposta

7

Nell'applicazione, non vi è alcuna differenza. Nel concetto, la differenza è sottile, ma nel primo caso si opera nel contesto corrente e si definisce un metodo su un'altra istanza di classe (in realtà, un metodo di istanza nel suo Eigenclass), mentre nel secondo caso si sta entrando il contesto della metaclasse ("Eigenclass") di un'altra istanza di classe e quindi la definizione di un metodo di istanza.

Edit:

Dovrei aggiungere che le ragioni per la scelta del class << self in alcuni casi sono ...

  1. Cleaner sintassi quando si definisce più di un paio di classe-metodi.
  2. È possibile eseguire altri tipi di codice nel contesto Eigenclass oltre a def my_method .... Ad esempio, puoi dire attr_accessor :some_attribute in quel blocco di codice.
4

Consiglio vivamente di leggere "Metaprogramming Ruby". Questo libro spiega il modello a oggetti di Ruby, incluso il metodo singleton e la classe singleton.

http://pragprog.com/titles/ppmetr/metaprogramming-ruby

Questo articolo spiega anche lo stesso argomento.

http://www.contextualdevelopment.com/articles/2008/ruby-singleton

+1

Farò il checkout rubino metaprogrammazione. – djburdick

+0

In realtà ho ricevuto il mio frammento di codice da quel link che hai inviato, dato che ero ancora confuso dopo quell'articolo. Estratto "Mentre alcuni linguaggi object oriented hanno strutture di classi che supportano sia i metodi di istanza che i metodi di classe (talvolta chiamati metodi statici), Ruby supporta solo i metodi di istanza.Se Ruby supporta solo i metodi di istanza, dove fanno tutti i metodi di classe che hai creato up? Perché, la classe singleton, ovviamente. " Per me ciò significa che il metodo self.method è lo stesso, ovvero sono tutti singleton – djburdick

+0

Ruby supporta solo i metodi di istanza, ma una classe è anche un'istanza della classe Class. Quando si aggiungono metodi a un'istanza (inclusa l'istanza di classe, ovvero una classe), si sta davvero cambiando la classe dell'istanza in una nuova sottoclasse anonima di ciò che era e quindi aggiungendo un nuovo metodo di istanza a tale sottoclasse. Quella sottoclasse anonima è spesso indicata come Eigenclass. –

Problemi correlati