2011-01-17 26 views
5

Sé que se puede incluir un módulo en una clase u otro módulo. Pero, vi here que un módulo está incluido en un método. ¿Qué significa esto?Ruby: ¿Qué significa el módulo incluido en un método?

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 

Respuesta

4

En este caso, el método definido tiene la intención de ser llamado a nivel de clase, así:

class Foo 
    include ActsAsVotable 
    acts_as_votable 
end 

Ruby tiene esta maravillosa/horrible, (depende de quién se le pregunte), característica que le puede definir dinámicamente una clase. Aquí, el método acts_as_votable llama primero a has_many (que agrega algunos métodos a la clase Foo) y luego agrega el método cast_vote a la clase Foo a través del include InstanceMethods.

Así, se termina con el equivalente de:

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

pensé que en Ruby una clase puede heredar sólo de otra clase, pero veo en su código que una clase hereda de un módulo: clase ' Foo

+0

Argh, estás en lo correcto. Debería haber sido 'clase Foo; incluye ActsAsVotable; acts_as_votable; fin'. He editado mi respuesta en consecuencia. – DarkDust

+0

Tampoco funciona para mí. Vea aquí: http://codepad.org/vDvpda9M –

Cuestiones relacionadas