2013-03-14 58 views
0

我在lib /中的项目中有一个模块。它的内容是这样的:在轨道上重复使用代码ruby

module Search 
    module Score 

    def get_score 
     return 'something' 
    end 

    end  
end 

这个搜索有很多不同的模块,我需要使用Score。我意识到我需要在我的模型中添加require(我试图从模型中使用它)。所以这里是我的代码(模型):

require 'search' 

class User < ActiveRecord::Base 

    def get_user_score 
    #tried this : 
    p Search::Score.get_score #error 
    #this as well 
    score_instance = Score.new #error 
    score = Search::Score.get_score # error undefined method `get_score' 
    end 

end 

那么如何重用我在其他类(模块)中的代码?

+1

我看不懂这个 – apneadiving 2013-03-14 13:53:14

回答

2

得到它的工作,你可以将模块组合成你的类:

require 'search' 

class User < ActiveRecord::Base 
    include Search::Score 

    def get_user_score 
    p get_score # => "something" 
    end 
end 

,也可以定义类似类方法的模块内部的方法:

module Search 
    module Score 
    def self.get_score 
     return 'something' 
    end 
    end  
end 

如果你这样做,你可以调用get_score像预期:

require 'search' 

class User < ActiveRecord::Base 
    def get_user_score 
    p Search::Score.get_score # => "something" 
    end 
end 

在深度更见this tutorial关于Ruby中模块的解释。

0

Search::Score是模块而不是类,所以Score.new将无法​​正常工作。

您可以尝试将get_score函数的签名更改为self.get_score

0

“模块是残废班”

模块是红宝石就像残废类。如果你查看继承链,你会发现一个类实际上是从Module继承的。

模块不能实例化。所以对.new的呼叫不起作用。

什么,但是你可以做的是指定方法为“类”的方法(我知道我说的是不是类......)

所以,你会在前面加一个自我是这样的:

module Search 
    module Score 

    def self.get_score 
     return 'something' 
    end 

    end  
end 

然后就可以调用这个方法,像你这样的一个类的方法在你的代码示例试图

+1

我不会称他们为跛脚类。它们是一个非常强大的功能,具有很好的存在理由,并且是使Ruby成为一门酷语言的关键。 Comparable和Enumerable是功能强大的模块,用于演示模块的优点。 – 2013-03-14 14:17:42