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

중복 질문 : ([기본적으로 매스 매 티카에서 함수의 또 다른 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의.

나는 이것에 대한 반환하지 1 또는 0OptionValue[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