2

在任何情况下,实现为 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
4

1 回答 1

2

如果您经常调用被 捕获的东西method_missing,那么搜索不存在的方法的行为最终可能会成为代码中的性能问题。所以调度表可能是解决这个问题的一种方法。

这是一篇很好的文章,描述了性能问题method_missing并尝试对其进行优化:http ://www.alef1.org/ruby/method_missing/

于 2011-10-16T09:07:33.923 回答