2011-09-25 13 views
6

Stavo studiando come viene implementato l'interprete Ruby e una domanda che non ha ancora ricevuto risposta per me. Questo è quello nel titolo: dal Class (r_cClass) ha super impostato su se stesso (ignorando i metaclassi, poiché in realtà super è il metaclasse di r_cClass), se invio un metodo all'oggetto Class, questo verrà cercato nella tabella dei metodi di Class 'classe. Ma la classe ClassClass, quindi non dovrei finire a cercare i metodi di istanza di Class? Ma non è il caso dato che nella documentazione i metodi di classe Class e i metodi di istanza Class sono separati. Nel numero search_method di Ruby, non ho trovato alcun controllo speciale per la classe Class. Qualcuno può far luce su questo?Come può Class essere della classe Class e non avere metodi di istanza di classe?

+0

In una domanda astratta come questa, è probabilmente una buona idea fornire esempi specifici, come un esempio di un metodo di istanza e un esempio di un metodo di classe. –

risposta

3

Le tue convinzioni sul modo in cui dovrebbe funzionare sembrano giuste, ma non sono sicuro del motivo per cui pensi che non funzioni in questo modo.

In Ruby 1.8.7:

irb> a = Class.new.methods - Object.new.methods 
=> [... 36 element array ...] 
irb> b = Class.methods - Object.new.methods 
=> [... 37 element array ...] 
irb> b - a 
=> ["nesting"] 

Un normale istanza di classe (Class.new) ha 36 metodi di istanza. Se guardo la classe stessa, che è anche una normale istanza di classe, ha gli stessi 36 metodi di istanza, più 1 metodo di classe aggiuntivo (annidamento), che esiste solo perché è ereditato dal suo modulo superclasse.

Si noti che l'aggiunta di un metodo di istanza a Class automaticamente lo aggiunge come metodo di classe, ma non aggiungendo una classe al metaclass di Classe.

irb> class Class ; def everywhere ; true ; end ; end 
irb> class << Class ; def only_singleton ; true ; end ; end 
irb> Class.everywhere 
=> true 
irb> Class.new.everywhere 
=> true 
irb> Class.only_singleton 
=> true 
irb> Class.new.only_singleton 
NoMethodError: undefined method 'only_in_singleton' for #<Class:0x4800ac8> 
+0

Quindi i metodi sono in effetti gli stessi. In realtà non c'è alcun indizio nel codice sorgente che mi ha portato a questo pensiero. È solo che i documenti Ruby separano chiaramente il metodo di istanza di classe dai metodi di classe singleton. Questa separazione è fatta solo per chiarezza? – eugeniodepalo

+0

Con i metodi singleton intendi metodi di classe? – rdvdijk

+0

Sì, intendo i metodi di classe. – eugeniodepalo

Problemi correlati