Дополнительные параметры, передаваемые по имени в Mathematica

Можно найти реализации OpenID здесь . Если бы Вы просто хотите больше информации, я проверил бы сайт OpenID .

12
задан dreeves 13 January 2011 в 12:54
поделиться

3 ответа

Я нашел стандартный способ сделать это в документации Mathematica: http://reference.wolfram.com/mathematica/tutorial/SettingUpFunctionsWithOptionalArguments.html

Options[foo] = {a->1, b->2, c->3};  (* defaults *)
foo[OptionsPattern[]] := bar[OptionValue@a, OptionValue@b, OptionValue@c]

Ввод "OptionValue" каждый раз немного громоздко. По какой-то причине вы не можете просто создать глобальную аббревиатуру, например ov = OptionValue , но вы можете сделать это:

foo[OptionsPattern[]] := Module[{ov},
  ov[x___] := OptionValue[x];
  bar[ov@a, ov@b, ov@c]]

Или это:

With[{ov = OptionValue},
  foo[OptionsPattern[]] := bar[ov@a, ov@b, ov@c]
]

Или это:

$PreRead = ReplaceAll[#, "ov" -> "OptionValue"] &;

foo[OptionsPattern[]] := bar[ov@a, ov@b, ov@c]
12
ответ дан 2 December 2019 в 18:54
поделиться

Я добавлю следующее возможное решение:

foo[opts___Rule] := Module[{f},
  f@a = 1; (* defaults... *)
  f@b = 2;
  f@c = 3;
  each[a_->v_, {opts}, f@a = v];

  Return[bar[f@a, f@b, f@c]]
]

Мне нравится его краткость, но я не думаю, что это стандартный способ. Есть ли какие-то проблемы с тем, чтобы сделать это таким образом?

PS, он использует следующую удобную служебную функцию:

SetAttributes[each, HoldAll];                (* each[pattern, list, body]     *)
each[pat_, lst_, bod_] :=                    (*  converts pattern to body for *)
  Scan[Replace[#, pat:>bod]&, Evaluate@lst]  (*   each element of list.       *)
1
ответ дан 2 December 2019 в 18:54
поделиться

Да, OptionValue может быть немного сложным, потому что он полагается на магию, так что

OptionValue [name] эквивалентно OptionValue [f, name] , где ] f - это начало левой части правила преобразования, в котором появляется OptionValue [name] .

Добавление явного автоматического обычно помогает, поэтому в вашем случае я бы сказал, что решение следующее:

Options[foo] = {a -> 1, b -> 2, c -> 3};
foo[OptionsPattern[]] := 
  bar @@ (OptionValue[Automatic, #] &) /@ First /@ Options[foo] 

Между прочим, варианты, которые раньше выполнялись путем сопоставления с opts : ___? OptionQ , а затем поиск значений параметров вручную как {a, b, c} /. Flatten [{opts}] . Проверка шаблона OptionQ все еще существует (хотя и не задокументирована), но подход OptionValue имеет то преимущество, что вы получаете предупреждения для несуществующих параметров (например, foo [d- > 3] ). Это также относится к вашему второму ответу, но не к тому, который вы приняли.

6
ответ дан 2 December 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: