2

ラムダのハッシュとして実装されたディスパッチ テーブルが、Ruby の method_missing をオーバーライドするよりも優れているとは言わないまでも、同じくらい良い状況はありますか? 私はRubyの比較的初心者ですが、以前はPerlのバックグラウンドがあり、ウィキペディアのディスパッチテーブルの例はPerlでも実装されているため、今日この手法を使用したためです;)参照:

http://en.wikipedia.org/wiki/Dispatch_table

いずれにしても、method_missing の代わりにディスパッチ テーブルを使用することの欠点は何ですか。以下の私のRubyコードが手がかりになるでしょうか?私のディスパッチ テーブルは非常に大きくなる可能性があり、別のコンテキストで使用するためにそこに含まれるラムダにアクセスする方法はありません。質問にはある程度答えているかもしれませんが、ディスパッチ テーブルが method_missing やその他のメタ プログラミング手法よりも優れたソリューションになる可能性があることに本当に興味があります。

def dispatch_self_and_modified_ancestors(key, value, work_effort)
    dispatch_table = {
        :scheduled_completion_date => lambda {|work_effort, updated_value|
            modified_ancestors = []

            while work_effort.parent
                work_effort = work_effort.parent
                if updated_value > work_effort.scheduled_completion_date
                    work_effort.scheduled_completion_date = updated_value
                    work_effort.save
                    modified_ancestors.push work_effort
                else
                    break
                end
            end

            return modified_ancestors
        }
    }

    if dispatch_table.has_key?(key)
        return dispatch_table[key].call(work_effort, value)
    else
        return []
    end
end
4

1 に答える 1

2

によって捕捉されたものを頻繁に呼び出す場合method_missing、存在しないメソッドを検索する行為がコードのパフォーマンスの問題になる可能性があります。したがって、ディスパッチ テーブルはそれを回避する 1 つの方法かもしれません。

これは、パフォーマンスの問題method_missingとそれらを最適化する試みについて説明した良い記事です: http://www.alef1.org/ruby/method_missing/

于 2011-10-16T09:07:33.923 に答える