我试图弄清楚是如何NextMethod()
工作的。我在 Chambers & Hastie (edts.)'s Statistical Models in S (1993, Chapman & Hall) 中找到了关于S3 类系统的最详细解释,但我发现关于NextMethod
调用的部分有点晦涩难懂。以下是我试图理解的相关段落(第 268-269 页)。
现在转向作为调用的结果调用的方法
NextMethod()
,这些方法的行为就好像它们是从以前的方法中通过特殊调用调用的一样。对继承方法的调用中的参数在数量、顺序和实际参数名称上与对当前方法的调用中的参数名称相同(因此,在对泛型的调用中)。然而,参数的表达式是当前方法的相应形式参数的名称。例如,假设表达式print(ratings)
调用了方法print.ordered()
。当这个方法被调用NextMethod()
时,这相当于对print.factor()
表单的调用print.factor(x)
,这里x
是x
在框架中的print.ordered()
。如果多个参数与形式参数匹配“...
”,这些参数在对继承方法的调用中表示 y 特殊名称“..1
”、“..2
”等。评估器识别这些名称并适当地对待它们(参见第 476 页的示例)。存在这个相当微妙的定义是为了确保 S 中函数调用的语义尽可能干净地延续到方法的使用中(比较 Becker、Chambers 和 Wilks 的The New S Language,第 354 页)。尤其是:
- 参数从当前方法传递到继承方法,并在
NextMethod()
调用时使用它们的当前值。- 惰性评估继续有效;未评估的论点保持未评估。
- 继承的方法中仍然缺少缺少的参数。
- 通过" " 形式参数传递的
...
参数以正确的参数名称到达。- 框架中与调用中的实际参数不对应的对象将不会传递给继承的方法。”
就参数而言,继承过程基本上是透明的。
我感到困惑的两点是:
- 什么是“当前方法”,什么是“以前的方法”?
- “对继承方法的调用中的参数”,“参数的表达式”和“当前方法的相应形式参数的名称”有什么区别?
一般来说,如果有人能以一种清晰的方式重述上述段落中的描述,我将不胜感激。