2011-01-06 3 views
1

Je connais des définitions de fonctions et déclarations variables étant dans les définitions de classe:Quelle est la signification de la classe de méthode dans la définition de classe dans Ruby?

public class MyClass { 
    public int myvar; 
    public void doSomething() { 

    } 
} 

Mais qu'est-ce que cela « signifie » en Ruby quand une méthode est en fait appelé dans la définition de la classe? Cela se produit amplement dans Rails, par exemple:

class User < ActiveRecord::Base 
    has_many :posts 
end 

Qu'est-ce exactement ce que fait faire (à un niveau plus bas que « il ajoute quelques méthodes à la classe »)? Comment pourrais-je mettre en œuvre une telle fonction (par exemple, une fonction qui mélange certaines méthodes supplémentaires)?

+0

je pense, mais je ne suis pas certain, que certaines langues ont un code qui fonctionne à la compilation et le code qui fonctionne à l'exécution. Je pense que ruby ​​fonctionne généralement à l'exécution. –

Répondre

2

Au cours de la définition d'une classe, le récepteur est l'objet de classe, et il est donc vraiment la même chose que le plus familier classe.méthode de technique d'appeler une méthode de classe. Donc, pour poursuivre l'analogie avec ClassName.new, vous pouvez appeler n'importe quelle méthode de classe de cette façon. Utilisons new comme exemple:

>> class C 
>> def happy 
>>  puts 'new year' 
>> end 
>> new 
>> end.happy 
new year 
=> nil 

BTW, ne pas confondre par le fait que cette méthode est définie dans la superclasse. Q: Quelle est la différence entre votre classe dérivée et votre instance superclasse? Dites ActiveRecord::Base? A: Rien! Il n'y a que l'instance d'une classe.

+0

Merci! J'ai remarqué sur la base de votre exemple que «monde» n'a pas été imprimé deux fois lorsque vous avez déclaré «B». Est-il correct de déduire que lors de l'extension d'une classe, les invocations de méthode dans la définition de classe ne sont pas appliquées (je suppose que les appels de méthode comme 'has_many' modifient réellement la définition de classe à l'exécution et donc héritent mesure, cependant)? Toute étrangeté supplémentaire dont je devrais être au courant? –

+0

has_many modifie les données stockées dans la classe Model. Les structures de données modifiées sont définies dans ActiveRecord :: Base ou d'autres modules déjà mélangés. Vous devriez jeter un oeil au code source dans A/R, il y a beaucoup de fraîcheur mixin qui se passe dans Rails – ffoeg

+1

Bien sûr, mais je ne pense pas L'OP demandait vraiment ce que fait Rails, qui inclut certainement beaucoup de magick de métaprogrammation.Je veux dire, le PO a spécifiquement demandé: "comment pourrais-je mettre en place une telle fonction?". Eh bien, ceci est la réponse à cette question exacte. – DigitalRoss

1

ActiveRecord :: Base définit la méthode de classe has_many. Ruby vous permet d'appeler des méthodes de classe de superclasse lors de la définition d'une sous-classe.

Vous pouvez le faire vous-même, ajouter vos propres méthodes de classe à ActiveRecord :: Base ou votre propre classe en faisant un module vous mélangez dans

Un exemple simple de la façon de faire vous-même.

module MyMixin 
    def self.included(base) 
    base.extend ClassMethods # Load class methods 
    super 
    end 
    module ClassMethods 
    def hello 
     puts "MyMixin says => Hello World" 
    end 
    end 
end 
ActiveRecord::Base.send :include, MyMixin 

Exemple d'utilisation:

class MyRecord < ActiveRecord::Base 
    hello 
end 

Rails cuisson jusqu'à vous verriez ce imprimé à la console:

MyMixin says => Hello World 
+1

C'est une bonne réponse mais je m'interroge sur * "Ruby vous permet d'appeler des méthodes de classe de super classe pendant la définition d'une sous-classe". * Je ne pense pas que ce soit entièrement vrai. Le récepteur est la classe que vous définissez. Vous appelez des méthodes de classe de votre propre classe, et celles-ci incluent des méthodes héritées de la superclasse. – DigitalRoss

+0

peut-être que le libellé est trop simplifié. Je n'ai pas vraiment envie d'être aspiré dans une longue discussion sur la signification de 'soi' – ffoeg

Questions connexes