8

私は何かをしたい

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

Mathematica1に の代わりに を与えてもらい0ます。これよりも良い方法はありますか

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

?

foo1 つには、呼び出しのたびに のオプションを設定するのは非効率的fooです。多くのオプションがある場合は特にそうです。

4

2 に答える 2

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

さらに、これにより、必要に応じて自動値のより複雑な解釈が可能になります。

于 2011-10-28T03:56:03.830 に答える
4

あなたが書いた:

私は何かをしたい

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

Mathematica1に の代わりに を与えてもらい0ます。

OROptionValue[a]ではなく、これに対するリターンとして取得します。これは、が一致し、一致しないためです。検討:10OptionValueOptionsPattern[]

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

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

目標を達成するための 1 つの方法を次に示します。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
于 2011-10-28T05:00:32.067 に答える