8

yerine 0 arasında,Birbirine bağlı seçenekler nasıl edinilir?

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

böyle bir şey yapmak ve Mathematica bana 1 vermek istiyorum. Bunu yapmak için

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

'dan daha iyi bir yolu var mı?

Her şeyden önce, özellikle foo birçok seçeneğe sahipse, foo seçeneklerinin ayarlanması etkin değildir.

+0

yinelenen soru: ([varsayılan Mathematica'da fonksiyonunun bir paramether bir fonksiyonu olan, isteğe bağlı bir değeri olan bir işlev tanımlama] http://stackoverflow.com/q/7394113/211.232) – WReach

cevap

8

Bu yüzden biz Automatic sahibiz. Ben böyle bir şey kullanmak istiyorum:

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

Artı de gerekirse bu otomatik değerlerin daha karmaşık yorumlanması için izin verir.

4

yazmıştın:

Ben

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

gibi bir şey yapmak istiyorum ve Mathematica bana 1 vermek zorunda, yerine 0 arasında.

Bunun için bir dönüş değil, 1 VEYA 0 olarak OptionValue[a] olsun. Bunun nedeni, OptionValue'un OptionsPattern[] ile eşleşmesidir ve bu değildir. Düşünün:

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

foo[it, doesnt, matter] 
(* Out[]= OptionValue[a] *)

İşte hedefe etkilemek için olası bir yöntemdir. Bu kuralları OptionValue dışında çalışabilmem için OptionsPattern[] adını verdim. Hala b için açık bir değer belirtebildiğime dikkat edin.

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