2

更新问题
这是我根据一些研究和发现所做的。

第 1 步- 我在我的 Rails 3 项目中有这个模块并将它放在我的 lib 文件夹中

# lib/enumerable.rb
module Enumerable
   def sum
      return self.inject(0){|acc,i|acc +i}
   end

   def average
      return self.sum/self.length.to_f
   end

   def sample_variance 
       avg=self.average
       sum=self.inject(0){|acc,i|acc +(i-avg)**2}
       return(1/self.length.to_f*sum)
   end

   def standard_deviation
       return Math.sqrt(self.sample_variance)
   end

end

第 2 步- 根据这篇博客文章,在 Rails 3 中,您的 lib 文件夹不会自动加载。为了加载这个模块,你需要去你的config / application.rb并输入:

config.autoload_paths += %W(#{config.root}/lib)

第 3 步- 然后在您的模型中,我的理解是您输入此内容以获取模块。

class MyModel < ActiveRecord::Base
    include Enumerable
end

第 4 步- 然后我尝试重新启动 rails 服务器并尝试一下,当我认为它是真的时,我得到了错误。

MyModel.respond_to?('sample_variance')
# false, when it should be true

我究竟做错了什么?我不应该变得真实吗?

4

3 回答 3

2

您包含的主要 Enumerable 模块(不是您的扩展)无疑是有效的,您可以通过简单地检查混入的任何方法来测试它。问题是,您的“包含 Enumerable”可能没有包含您的文件,但是而是主模块。

一个建议是重命名扩展名的文件名,并通过初始化程序加载它

require 'my_enumerable.rb'

这样,您肯定会同时加载 Enumerable 和对 Enumerable 的扩展。

于 2011-12-04T00:28:07.990 回答
0

You might want to take a look at this:

http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html

You can include a module in a class, and thereby make that module's methods available to that class.

If you include Enumerable into a Rails model, then its methods would be available to that model. But since Enumerable's methods are already available to certain types of objects inside your Rails project, and those objects are available to be instantiated from inside your model, I don't see why you might do that, because Enumerable's methods are working just fine for the purposes they were designed.

Anyway, you might find that one of the following might work for you:

-- use Activerecord's sum method

-- convert your object to an array, and use Enumerable's sum method

-- write your own method, but don't call it sum, because you don't want to confuse yourself.

Try commenting out the second occurrence of module Neuone in the following snippet, and see what happens. Then try commenting out the Charlie.one method, and see what happens.

module Neuone
def one
  'neuone one'
end 

def two
  'neuone two'
end

end

module Neuone
def two
  'neuone two two'
end

end

class Charlie include Neuone

def one
    'charlie one'
end

end

c = Charlie.new p c.one p c.two

于 2011-03-12T19:22:52.983 回答
0

如果我明白你在做什么,你正在尝试在 ActiveRecord 中使用 Enumerable 的 sum 方法。您可以通过将当前对象转换为数组,然后在该数组上调用 Enumerable 的 sum 方法来做到这一点。

还有一件事:您不需要像使用它那样使用 return 。Ruby 会从你的方法返回最后计算的东西。您也不需要像这样使用 self —— 在 Ruby 中,self 是当前对象。

所以如果你有一个方法:

def charlie
  inject{|i, j| i + j + 1}
end

你这样称呼它:

(1..2).charlie

self 是当前对象(1..2)

输出将是4,没有自我或回报。

我强烈推荐 Dave Thomas 关于 Ruby 元编程的讲座,我试图找到它,但我找不到,它在网络上的某个地方。

于 2011-03-12T17:07:55.013 回答