可以看到函数 f 的定义是存在 f 的 DownValues,但是函数 g 的定义却是存在 g 的 SubValues 中的,对于一般的不涉及自定义函数属性操作的话,两者区别不大,推荐使用第一种表达方式,但是如果你除了自定义函数外,还要赋予函数一些属性,例如 HoldAll,Listable 等等,那么两者是有一些显著的差异的,稍不注意就会出错,切记只有 DownValues 定义的函数才能使所有的参数全部继承这些属性,而通过 SubValues 定义的函数只有最外面的参数才能继承属性. 下面是一个例子,看了之后就明白了.
上图中 f 和 g 的执行结果是不一样的. 两者本质上还是有一些细微的不同,主要反映在两个函数的值集的不同,见下图:
可以看到函数 f 的定义是存在 f 的 DownValues,但是函数 g 的定义却是存在 g 的 SubValues 中的,对于一般的不涉及自定义函数属性操作的话,两者区别不大,推荐使用第一种表达方式,但是如果你除了自定义函数外,还要赋予函数一些属性,例如 HoldAll,Listable 等等,那么两者是有一些显著的差异的,稍不注意就会出错,切记只有 DownValues 定义的函数才能使所有的参数全部继承这些属性,而通过 SubValues 定义的函数只有最外面的参数才能继承属性. 下面是一个例子,看了之后就明白了.