Когда таблица отправки может быть такой же, как method_missing в Ruby? - PullRequest
2 голосов
/ 14 октября 2011

Существуют ли ситуации, когда таблица диспетчеризации, реализованная в виде хеша лямбда-выражений, может быть настолько же хорошей, если не лучше, чем переопределение метода method_missing в Ruby? Я спрашиваю, потому что я использовал эту технику сегодня, так как я сравнительный новичок с 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

1 Ответ

2 голосов
/ 16 октября 2011

Если вы часто вызываете что-то, пойманное method_missing, поиск несуществующего метода может привести к снижению производительности в вашем коде. Таким образом, таблица отправки может быть одним из способов обойти это.

Вот хорошая статья, описывающая проблемы производительности method_missing и попытки их оптимизации: http://www.alef1.org/ruby/method_missing/

...