モジュールを組み込むことで、動的に生成されるメソッドをオーバーライドしようとしています。このモジュールを組み込むことで、動的に生成されるメソッドがオーバーライドされないのはなぜですか?
以下の例では、Rippleアソシエーションがrows=
メソッドを表に追加します。私はそのメソッドを呼び出すだけでなく、後でいくつか追加のものを行います。
私はモジュールのrow=
が既存のメソッドを使用するためにsuper
を呼び出すことができると考えて、メソッドをオーバーライドするモジュールを作成しました。
class Table
# Ripple association - creates rows= method
many :rows, :class_name => Table::Row
# Hacky first attempt to use the dynamically-created
# method and also do additional stuff - I would actually
# move this code elsewhere if it worked
module RowNormalizer
def rows=(*args)
rows = super
rows.map!(&:normalize_prior_year)
end
end
include RowNormalizer
end
私はその中に例外を発生させた場合、何も起こらないという事実によって証明されるようにしかし、私の新しいrows=
は、呼び出されることはありません。
私はモジュールが含まれていることを知っています。なぜなら、これを入れれば例外が発生するからです。
included do
raise 'I got included, woo!'
end
また、代わりrows=
の場合、モジュールは、そのメソッドが呼び出し可能であり、somethingelse=
定義します。
モジュールメソッドが動的に生成されたメソッドをオーバーライドしないのはなぜですか?
私はアップアップしようとしていましたが、その後、あなたは立ち去って、誰もぶら下げていました。 :-) –
ありがとう!私はこれを知っている必要があります:私はここに継承チェーンを書きました... http://stackoverflow.com/questions/3492679/ruby-determining-method-origins :) –