2013-03-14 61 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