Можно найти реализации OpenID здесь . Если бы Вы просто хотите больше информации, я проверил бы сайт OpenID .
Я нашел стандартный способ сделать это в документации 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]
Я добавлю следующее возможное решение:
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. *)
Да, 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]
). Это также относится к вашему второму ответу, но не к тому, который вы приняли.