8

我想要做這樣的事情我如何獲得相互依賴的選項?

foo[OptionsPattern[]] := OptionValue[b] 
Options[foo] = {a -> 0, b :> OptionValue[a]}; 
foo[a -> 1] 

,並有數學給我1,而不是0。有沒有比

更好的方法
foo[OptionsPattern[]] := (
    Options[foo] = {a -> 0, b :> OptionValue[a]}; 
    OptionValue[b] 
) 
foo[a -> 1] 

首先,在每次呼叫時設置foo的選項效率很低,特別是如果foo有很多選項。

+0

重複問題:[定義與可選值,該值是通過在缺省數學函數的另一paramether的功能的功能](http://stackoverflow.com/q/7394113/211232) – WReach

回答

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 *) 

此外,如果您需要它可以更自動地解釋自動值。

4

您寫道:

我要像做

foo[OptionsPattern[]] := OptionValue[b] 
Options[foo] = {a -> 0, b :> OptionValue[a]}; 
foo[a -> 1] 

,並有數學給我1,而不是0

我得到OptionValue[a]作爲此一回,不10。這是因爲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