0

我的项目中有一个模块,位于 lib/. 它的内容是这样的:

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

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

4

5 回答 5

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 中模块的更深入解释,请参阅本教程。

于 2013-03-14T14:10:47.490 回答
0

首先,请参阅“在 Ruby on Rails 中重用控制器之间代码的最佳实践”。

关于将代码重用为模块,请查看“ Rethinking code reuse with Modularity for Ruby ”。

于 2013-03-14T13:56:45.210 回答
0

Search::Score是一个模块而不是一个类,所以Score.new不会工作。

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

于 2013-03-14T13:57:30.450 回答
0

“模块是残缺的类”

模块就像 Ruby 中的残缺类。如果你查看继承链,你会发现一个类实际上是从模块继承的。

无法实例化模块。所以对 .new 的调用不起作用。

但是,您可以做的是将您的方法指定为“类”方法(我知道我说过它不是类...)

所以你会像这样在前面添加一个自我:

module Search
  module Score

    def self.get_score
      return 'something'
    end

  end    
end

然后您可以将此方法作为类方法调用,就像您在代码示例中尝试的那样

于 2013-03-14T14:10:33.823 回答
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)中的首选方法,尽管在实践中我个人并没有经常看到它。

于 2019-06-28T13:57:18.887 回答