Как мне получить взаимозависимые варианты? - PullRequest
8 голосов
/ 28 октября 2011

Я хочу сделать что-то вроде

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 ]

8 голосов
/ 28 октября 2011

Вот почему у нас 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 голосов
/ 28 октября 2011

Вы писали:

Я хочу сделать что-то вроде

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

и пусть Mathematica даст мне 1 вместо 0.

Я получаю OptionValue[a] в качестве возврата, а не 1 ИЛИ 0. Это потому, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...