为什么方法继承会杀死其他参数?

时间:2018-02-14 08:19:46

标签: r oop inheritance class-method

我想在我的泛型中设置一些标志(调用 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <android.support.design.widget.NavigationView android:id="@+id/nav1" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/nav_header" app:menu="@menu/nav_drawer_items" app:itemBackground="@color/app_bg_color" app:itemIconTint="@color/text_white" app:itemTextColor="@color/text_white" android:background="@color/bottom_navigation_color" android:fitsSystemWindows="true" android:theme="@style/NavigationView" /> </android.support.v4.widget.DrawerLayout> 之前,我知道很多:)),然后在方法中使用和/或更新这些标志。 / p>

像这样:

UseMethod()

直接跳转到默认方法时会起作用:

g <- function(x) {
  y <- 10
  UseMethod("g")
}
g.default <- function(x) {
  c(x = x, y = y)
}
g.a <- function(x) {
  y <- 5  # update y from generic here
  NextMethod()
}

但是当我经历g(structure(.Data = 1, class = "c")) # here y is never updated # x y # 1 10 时,NextMethod()神秘地消失了:

y

想出了如何解决这个问题,只需要经过g(structure(.Data = 1, class = "a")) # here y is updated, but cannot be found # Error in g.default(structure(.Data = 1, class = "a")) : # object 'y' not found

y

产生

f <- function(x, ...) {
  y <- 10
  UseMethod("f")
}
f.default <- function(x, ..., y = 3) {
  c(x = x, y = y)
}
f.a <- function(x, ...) {
  y <- 5
  NextMethod(y = y)
}

我的问题是: 为什么在上面的f(structure(.Data = 1, class = "c")) # x y # 1 3 f(structure(.Data = 1, class = "a")) # x y # 1 5 举例NextMethod() - 示例会杀死额外的g().*参数

我认为yUseMethod()的重点是将所有对象从调用传递给调用,没有必须手动传递它们:

  

NextMethod的工作原理是为下一个方法创建一个特殊的调用框架。如果没有提供新的参数,那么参数的数量,顺序和名称将与当前方法的参数相同,但它们的值将是在当前方法和环境中评估其名称的承诺。

     

我特别感到困惑的是,NextMethod()似乎确实传递了UseMethod(),但y却没有。

1 个答案:

答案 0 :(得分:8)

正如@Roland指出的那样,记录了这种行为:

help("UseMethod")关于UseMethod()注意事项的段落(强调添加):

  

UseMethod创建一个新的函数调用,其参数在进入泛型时匹配。 保留在调用UseMethod之前定义的任何局部变量(与S不同)。在调用UseMethod之后的任何语句都不会被评估,因为UseMethod不会返回。

关于NextMethod()(上文已经引用过)的相应段落仅注明:

  

NextMethod的工作原理是为下一个方法创建一个特殊的调用框架。如果没有提供新的参数,那么参数的数量,顺序和名称将与当前方法的参数相同,但它们的值将是在当前方法和环境中评估其名称的承诺。与...匹配的任何命名参数都是专门处理的:它们要么替换同名的现有参数,要么附加到参数列表中。它们作为作为当前环境的参数提供的promise传递。 (S以不同的方式做到这一点!)如果他们已经在当前(或以前的环境)中进行了评估,他们仍然会被评估。 (这是一个复杂的领域,可能会有变化:参见草案'R语言定义'。)

简而言之,UseMethod()做了一些特别和非凡的事情:传递局部变量NextMethod(),按照惯例,不会这样做。

UseMethod()是个例外,不是NextMethod()