8

मैं 0 के बजाय तरहमैं परस्पर निर्भर विकल्प कैसे प्राप्त करूं?

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

कुछ करना और मेथेमेटिका मुझे 1 देने के लिए, चाहते हैं।

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

से ऐसा करने का कोई बेहतर तरीका है?

एक बात के लिए, प्रत्येक कॉल पर foo के विकल्पों को सेट करने में अक्षम है, खासकर अगर foo में कई विकल्प हैं।

+0

डुप्लिकेट प्रश्न: ([एक वैकल्पिक मूल्य कि mathematica में समारोह का एक और paramether की एक समारोह है डिफ़ॉल्ट रूप से के साथ एक समारोह को परिभाषित करना] http://stackoverflow.com/q/7394113/211,232) – 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 के बजाय।

मैं इस के लिए एक वापसी, नहीं 1 या 0 रूप OptionValue[a] मिलता है। ऐसा इसलिए है क्योंकि OptionValueOptionsPattern[] से मेल खाना है और यह नहीं है। पर विचार करें:

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