我的项目中有一个模块在lib /中。它的内容是这样的:
module Search
module Score
def get_score
return 'something'
end
end
end
此搜索有许多不同的模块,我需要使用分数。我意识到我需要在我的模型中添加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
那么如何重用我在其他类(模块)中的代码?
答案 0 :(得分: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
有关Ruby中模块的更深入解释,请参阅this tutorial。
答案 1 :(得分:0)
首先,请参阅“Best Practices for reusing code between controllers in Ruby on Rails”。
关于重用代码作为模块,请查看“Rethinking code reuse with Modularity for Ruby”。
答案 2 :(得分:0)
Search::Score
是一个模块,而不是一个类,因此Score.new
将不起作用。
您可以尝试将get_score
功能的签名更改为self.get_score
。
答案 3 :(得分:0)
“模块是残缺的课程”
模块就像Ruby中的残缺类。如果查看继承链,您会发现Class实际上是从Module继承的。
模块无法实例化。因此,对.new的调用无效。
你可以做的是将你的方法指定为“类”方法(我知道我说它不是一个类......)
所以你会像这样在前面添加一个自我:
module Search
module Score
def self.get_score
return 'something'
end
end
end
然后,您可以像在代码示例中尝试的那样将此方法称为类方法
答案 4 :(得分:0)
除了以上答案中的def self.get_score
外,还有extend self
,如下所示:
module Search
module Score
extend self
def get_score
return 'something'
end
end
end
和module_function
:
module Search
module Score
module_function
def get_score
return 'something'
end
end
end
后一种方法实际上是RuboCop (source)中的首选方法,尽管实际上我个人并不经常看到它。