【发布时间】:2011-02-17 23:45:57
【问题描述】:
我在编写带选项的函数时遇到了一些问题。选项值之一是函数。我想得到这个值,但不对其进行评估。我尝试了我能想到的每一件事,但到目前为止没有任何效果。
基本上,为了说明这是我尝试过的:
SetAttributes[Foo, HoldRest];
Options[Foo] = {Blah -> None}
Foo[x_, OptionsPattern[]] :=
Module[{blah},
blah = OptionValue[Automatic, Automatic, Blah, Hold];
.
.
.
然后当我有:
func[a_, b_, c_] := a + b + c;
我希望能够通过以下方式调用 Foo:
Foo[2, Blah -> func[1, 2, 3]]
并且让“blah”变量(在 Foo 中)不被计算,即 blah = func[1, 2, 3]。
提前感谢所有帮助!
编辑:
由于太长无法详细说明的原因,我不能使用 RuleDelayed (:>)。我正在尝试编写一个将包含在包中的函数,供不真正了解 Mathematica 的其他人使用,因此他们不知道 :> 是什么。使用规则 (->) 来指定选项及其值是标准方法,他们对此很熟悉。
为了进一步说明,假设我正在尝试编写一个数字生成器函数,该函数将生成实际数字的函数作为其选项之一:
Options[GenerateNumbers] = {GeneratorFunction -> None};
GenerateNumbers[n_, OptionsPattern[]] :=
Module[{func},
func = OptionValue[GeneratorFunction];
Table[func, {n}]
]
]
现在,如果我使用以下值调用此函数:
GenerateNumbers[5, GeneratorFunction -> RandomReal[10]]
它将返回一个包含 5 个相同数字的列表,因为 RandomReal[10] 被评估一次,而不是在 Table 的每次迭代中。我想防止这种情况。问题比较复杂,但就是这样。
谢谢!
【问题讨论】: