Старые привычки умирают тяжело, и я понимаю, что я использую opts___Rule сопоставление образцов и конструкций, таких как thisoption /. {opts} /. Options[myfunction] в очень большом пакете, который я сейчас разрабатываю. Сал Мананго "Поваренная книга по математике" напоминает мне, что способ выполнения этой версии после версии - opts:OptionsPattern[] и OptionValue[thisoption]. Пакет требует версии 8 в любом случае, но я никогда не менял способ написания такого кода на протяжении многих лет.
Стоит ли рефакторинг всего того, что я делал с моей до-версии-6? Есть ли производительность или другие преимущества?
Привет
Verbeia
ИЗМЕНИТЬ: Сводка
В ответ на этот вопрос было сделано много хороших моментов, поэтому спасибо (и, плюс, конечно, все). Подводя итог, да, я должен реорганизовать использование OptionsPattern и OptionValue. (NB: OptionsPattern не OptionPattern, как это было раньше!) Существует несколько причин:
- Прикосновение быстрее (@Sasha)
- Он лучше обрабатывает функции, где аргументы должны находиться в
HoldForm(@Leonid) -
OptionsPatternавтоматически проверяет, что вы передаете действительный параметр этой функции (FilterRulesвсе равно понадобится, если вы переходите к другой функции (@Leonid) - Он обрабатывает
RuleDelayed(:>) намного лучше (@rcollyer) - Он обрабатывает вложенные списки правил без использования
Flatten(@Andrew) - Немного проще назначить несколько локальных переменных, используя
OptionValue /@ listвместо нескольких вызовов наsomeoptions /. {opts} /. Options[thisfunction](появилось в комментариях между @rcollyer и мной)
EDIT: 25 июля Первоначально я думал, что одно время, использующее синтаксис /., может иметь смысл, если вы намеренно извлекаете параметр по умолчанию из другой функции, а не тот, который на самом деле называется, Оказывается, это обрабатывается с помощью формы OptionsPattern[] со списком голов внутри нее, например: OptionsPattern[{myLineGraph, DateListPlot, myDateTicks, GraphNotesGrid}] (см. Раздел "Дополнительная информация" в документация). Я только недавно это сделал.