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 サーバーを再起動してこれを試してみると、true であると予想されるときに false になります。

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

私は何を間違っていますか?私は真実になってはいけないのですか?

4

3 に答える 3

2

メインの Enumerable モジュール (拡張機能ではない) を含めることは間違いなく機能し、混合されたメソッドのいずれかをチェックするだけでテストできます。問題は、「Include Enumerable」にファイルが含まれていない可能性があることですが、むしろメインモジュール。

1 つの提案は、拡張機能のファイル名を変更し、初期化子を使用してロードすることです。

require 'my_enumerable.rb'

そうすれば、Enumerable と Enumerable への拡張機能の両方がロードされます。

于 2011-12-04T00:28:07.990 に答える
0

あなたはこれを見てみたいかもしれません:

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

モジュールをクラスに含めて、そのモジュールのメソッドをそのクラスで使用できるようにすることができます。

RailsモデルにEnumerableを含めると、そのモデルでそのメソッドを使用できるようになります。しかし、EnumerableのメソッドはRailsプロジェクト内の特定のタイプのオブジェクトですでに使用可能であり、それらのオブジェクトはモデル内からインスタンス化できるため、Enumerableのメソッドは正常に機能しているため、なぜそうするのかわかりません。それらが設計された目的。

とにかく、あなたは次のいずれかがあなたのために働くかもしれないことに気付くかもしれません:

--Activerecordのsumメソッドを使用します

--オブジェクトを配列に変換し、Enumerableのsumメソッドを使用します

--独自のメソッドを作成しますが、混乱させたくないので、sumとは呼ばないでください。

次のスニペットでモジュールNeuoneの2番目の出現をコメントアウトしてみて、何が起こるかを確認してください。次に、Charlie.oneメソッドをコメントアウトして、何が起こるかを確認してください。

module Neuone
def one
  'neuone one'
end 

def two
  'neuone two'
end

終わり

module Neuone
def two
  'neuone two two'
end

終わり

クラスチャーリーにはNeuoneが含まれます

def one
    'charlie one'
end

終わり

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

于 2011-03-12T19:22:52.983 に答える
0

あなたが運転していることを理解していれば、ActiveRecord で Enumerable の sum メソッドを使用しようとしています。これを行うには、現在のオブジェクトを配列に変換し、その配列で Enumerable の sum メソッドを呼び出します。

もう 1 つ: return を使用しているように使用する必要はありません。Ruby はメソッドから最後に計算されたものを返します。そのように self を使用する必要もありません。Ruby では、self が現在のオブジェクトです。

したがって、メソッドがある場合:

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

そして、あなたはそれを次のように呼びます:

(1..2).charlie

self は現在のオブジェクト(1..2)です。

出力は になり4、self も return もありません。

Dave Thomas の Ruby メタプログラミングに関する講義を強くお勧めします。見つけようとしましたが、見つかりませんでした。Web のどこかにあります。

于 2011-03-12T17:07:55.013 に答える