何时调度表可能与Ruby中的method_missing一样好?

时间:2011-10-14 18:46:12

标签: ruby metaprogramming dispatch method-missing dispatch-table

是否有任何情况下,作为lambda的散列实现的调度表可能与覆盖Ruby的method_missing一样好,如果不是更好的话?我问,因为我今天使用这种技术,因为我是Ruby的比较新手,但以前有过Perl背景,维基百科中的调度表示例甚至在Perl中实现;)请参阅:

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

无论如何,使用调度表而不是method_missing有什么缺点。也许我下面的Ruby代码给出了一个线索?看起来我的调度表可能会变得非常大,并且无法访问它包含的lambdas以便在另一个上下文中使用。所以也许我在某种程度上回答了我的问题,但我真的很感兴趣的是,调度表可能是比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

1 个答案:

答案 0 :(得分:2)

如果您经常调用method_missing捕获的内容,搜索不存在的方法的行为最终可能会成为代码中的性能问题。因此,调度表可能是解决这个问题的一种方法。

这是一篇很好的文章,描述了method_missing的效果问题以及优化它们的尝试:http://www.alef1.org/ruby/method_missing/