我想做点什么
foo[OptionsPattern[]] := OptionValue[b]
Options[foo] = {a -> 0, b :> OptionValue[a]};
foo[a -> 1]
让Mathematica给我1
,而不是0
。有没有比
foo[OptionsPattern[]] := (
Options[foo] = {a -> 0, b :> OptionValue[a]};
OptionValue[b]
)
foo[a -> 1]
首先,在每次通话中设置foo
的选项效率很低,尤其是foo
有很多选项时。
答案 0 :(得分:8)
这就是我们Automatic
的原因。我会使用类似的东西:
Options[foo] = {a -> 0, b -> Automatic};
foo[OptionsPattern[]] :=
Block[{a, b},
{a, b} = OptionValue[{a, b}];
If[b === Automatic, a, b]
]
foo[]
(* --> 0 *)
foo[a -> 1]
(* --> 1 *)
foo[a -> 1, b -> 2]
(* --> 2 *)
另外,如果需要,可以对自动值进行更复杂的解释。
答案 1 :(得分:4)
您写道:
我想做点什么
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]
。考虑:
OptionsPattern[]
(* Out[]= OptionValue[a] *)
这是实现目标的一种可能方法。我将b
命名为,以便我可以在OptionValue之外使用这些规则。请注意,我仍然可以为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}}
1
7