Старые привычки умирают тяжело, и я понимаю, что я использую 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}]
(см. Раздел "Дополнительная информация" в документация). Я только недавно это сделал.