2011-01-17 9 views
5

Ich weiß, dass ein Modul in einer Klasse oder einem anderen Modul enthalten sein kann. Aber ich sah here, dass ein Modul in einer Methode enthalten ist. Was bedeutet das? auf der Ebene der Klassen aufgerufen werden, wie diesRuby: Was bedeutet Modul in einer Methode enthalten?

module ActsAsVotable 

    module ClassMethods 

    def acts_as_votable 
     has_many :votes, :as => :votable, :dependent => :delete_all 
     include InstanceMethods # What does this means ?? 
    end 

    end 

    module InstanceMethods 

    def cast_vote(vote) 
     Vote.create(:votable => self, :up => vote == :up) 
    end 

    end 

end 

Antwort

4

In diesem Fall wird die definierte Methode gemeint:

class Foo 
    include ActsAsVotable 
    acts_as_votable 
end 

Ruby hat diese wunderbare/schrecklich (hängt davon ab, wen man fragt) Funktion, die Sie kann dynamisch eine Klasse definieren. Hier ist die acts_as_votable Methode ruft zuerst has_many (was ein paar mthods der Klasse fügt Foo) und fügt dann die cast_vote Methode zum Foo Klasse durch die include InstanceMethods.

Also, am Ende mit dem Äquivalent von bis:

class Foo 
    # Will add further methods. 
    has_many :votes, :as => :votable, :dependent => :delete_all 

    # include InstanceMethods 
    def cast_vote(vote) 
     Vote.create(:votable => self, :up => vote == :up) 
    end 
end 
+0

Ich dachte, dass in Ruby eine Klasse nur von anderen Klasse erben kann, aber ich sehe in Ihrem Code, der eine Klasse von einem Modul erbt: 'Klasse Foo . Was bedeutet das ? –

+0

Argh, du hast Recht. Es hätte 'Klasse Foo sein müssen; beinhalten ActsAsVotable; acts_as_votable; Ende. Habe meine Antwort entsprechend bearbeitet. – DarkDust

+0

Es funktioniert auch nicht für mich. Sehen Sie hier: http://codepad.org/vDvpda9M –