Когда таблица отправки может быть такой же, как method_missing в Ruby?
Существуют ли ситуации, когда таблица диспетчеризации, реализованная как хэш-код lambdas, может быть столь же хороша, если не лучше, чем переопределение метода 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 ответ
Если вы часто звоните что-то пойманному method_missing
поиск несуществующего метода может привести к снижению производительности вашего кода. Таким образом, таблица диспетчеризации может быть одним из способов обойти это.
Вот хорошая статья, описывающая проблемы производительности method_missing
и попытки их оптимизации: http://www.alef1.org/ruby/method_missing/