Вы писали:
Я хочу сделать что-то вроде
foo[OptionsPattern[]] := OptionValue[b]
Options[foo] = {a -> 0, b :> OptionValue[a]};
foo[a -> 1]
и пусть Mathematica даст мне 1
вместо 0
.
Я получаю OptionValue[a]
в качестве возврата, а не 1
ИЛИ 0
. Это потому, что OptionValue
должен совпадать с OptionsPattern[]
, а это не так. Рассмотрим:
ClearAll[foo, a, b]
Options[foo] = {a -> 0};
foo[___] := OptionValue[a]
foo[it, doesnt, matter]
(* Out[]= OptionValue[a] *)
Вот один из возможных способов достижения вашей цели. Я называю OptionsPattern[]
, чтобы я мог работать с этими правилами вне OptionValue. Обратите внимание, что я все еще могу указать явное значение для b
.
ClearAll[foo, a, b]
Options[foo] = {a -> 0, b -> a};
foo[opts : OptionsPattern[]] := OptionValue[b] /. {opts}
foo[a -> 1]
foo[a -> 3, b -> 7]
1
7