我想在我的泛型中设置一些标志(在调用 <?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().*
参数?
我认为y
和UseMethod()
的重点是将所有对象从调用传递给调用,没有必须手动传递它们:
NextMethod的工作原理是为下一个方法创建一个特殊的调用框架。如果没有提供新的参数,那么参数的数量,顺序和名称将与当前方法的参数相同,但它们的值将是在当前方法和环境中评估其名称的承诺。
我特别感到困惑的是,NextMethod()
似乎确实传递了UseMethod()
,但y
却没有。
答案 0 :(得分:8)
正如@Roland指出的那样,记录了这种行为:
从help("UseMethod")
关于UseMethod()
注意事项的段落(强调添加):
UseMethod创建一个新的函数调用,其参数在进入泛型时匹配。 保留在调用UseMethod之前定义的任何局部变量(与S不同)。在调用UseMethod之后的任何语句都不会被评估,因为UseMethod不会返回。
关于NextMethod()
(上文已经引用过)的相应段落仅注明:
NextMethod的工作原理是为下一个方法创建一个特殊的调用框架。如果没有提供新的参数,那么参数的数量,顺序和名称将与当前方法的参数相同,但它们的值将是在当前方法和环境中评估其名称的承诺。与...匹配的任何命名参数都是专门处理的:它们要么替换同名的现有参数,要么附加到参数列表中。它们作为作为当前环境的参数提供的promise传递。 (S以不同的方式做到这一点!)如果他们已经在当前(或以前的环境)中进行了评估,他们仍然会被评估。 (这是一个复杂的领域,可能会有变化:参见草案'R语言定义'。)
简而言之,UseMethod()
做了一些特别和非凡的事情:传递局部变量。
NextMethod()
,按照惯例,不会这样做。
UseMethod()
是个例外,不是NextMethod()
。