内置OptionValue
的实现包含一些魔法,以便
OptionValue[name]
相当于OptionValue[f, name]
,其中f
是。{1}} 左侧的头部 转型规则OptionValue[name]
出现。
是否有人知道如何为Options
实现类似的东西,即实现一个autoOptions[]
,它将解析为转换规则左侧的符号定义的选项autoOptions[]
出现了吗?
为清楚起见,我正在寻找的是一种制作方法
Options[foo]={bar->1};
foo[OptionsPattern[]]:=autoOptions[]
foo[]
输出{bar->1}
最终目标是在this question中执行类似于{{3}}中所请求的操作,而不必更改除定义的RHS之外的任何内容。
答案 0 :(得分:6)
这是一个简单的非常原理图:
Module[{tried},
Unprotect[SetDelayed];
SetDelayed[f_[args___, optpt : OptionsPattern[]], rhs_] /;
!FreeQ[Unevaluated[rhs], autoOptions[]] :=
Block[{tried = True},
f[args, optpt] :=
Block[{autoOptions}, autoOptions[] = Options[f]; rhs]] /; ! TrueQ[tried];
Protect[SetDelayed];]
您的用法:
In[8]:= Options[foo] = {bar -> 1};
foo[OptionsPattern[]] := autoOptions[]
foo[]
Out[10]= {bar -> 1}
请注意,当传递显式选项时,这不起作用 - 考虑它们是一些更多的工作,这通常不是一个很好的做法,因为我超载了SetDelayed
- 但你要求它,你得到它它。