Sono bloccato. Sto provando a definire dinamicamente un metodo di classe e non riesco a spiegarmi il modello di metaclasse rubino. Considerare la seguente classe:Ruby metaclass follia
class Example
def self.meta; (class << self; self; end); end
def self.class_instance; self; end
end
Example.class_instance.class # => Class
Example.meta.class # => Class
Example.class_instance == Example # => true
Example.class_instance == Example.meta # => false
Ovviamente entrambi i metodi restituiscono un'istanza di Classe. Ma queste due istanze non sono le stesse. Essi hanno anche diversi antenati:
Example.meta.ancestors # => [Class, Module, Object, Kernel]
Example.class_instance.ancestors # => [Example, Object, Kernel]
Qual è il punto a fare la differenza tra la metaclasse e l'istanza di classe?
Ho capito che posso convertire send :define_method
nella metaclasse per definire dinamicamente un metodo, ma se provo a inviarlo all'istanza della classe non funzionerà. Almeno potrei risolvere il mio problema, ma voglio ancora capire perché funziona in questo modo.
Aggiornamento Mar 15, 2010 13:40
sono le seguenti ipotesi corretta.
- Se si dispone di un metodo di istanza che chiama self.instance_eval e definisce un metodo, influirà solo sulla particolare istanza di tale classe.
- Se si dispone di un metodo di istanza che chiama self.class.instance_eval (che equivale a chiamare class_eval) e definisce un metodo, avrà effetto su tutte le istanze di quella particolare classe risultante in un nuovo metodo di istanza.
- Se si dispone di un metodo di classe che chiama instance_eval e definisce un metodo, verrà generato un nuovo metodo di istanza per tutte le istanze.
- Se si dispone di un metodo di classe che chiama instance_eval sulla classe meta/eigen e definisce un metodo, verrà generato un metodo di classe.
Penso che abbia senso per me. Certamente limiterebbe le tue possibilità se self all'interno di un metodo di classe punterebbe alla classe eigen. In tal caso, non sarebbe possibile definire un metodo di istanza all'interno di un metodo di classe. È corretto?
Per ulteriori informazioni su _why_ a 'def' all'interno di un' instance_eval' definisce i metodi di classe, vedere questo articolo http://yugui.jp/articles/846 – horseyguy
Grazie mille finora. Aggiorno la mia domanda Ti dispiacerebbe dargli un'occhiata? – t6d
Aggiornato per rispondere alle domande nel tuo aggiornamento. – khelll