我如何获得相互依赖的选择?

时间:2011-10-28 01:17:40

标签: wolfram-mathematica options optional-parameters optional-values

我想做点什么

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有很多选项时。

2 个答案:

答案 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]作为回报,而不是10。这是因为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