【发布时间】:2017-12-06 16:46:51
【问题描述】:
最近我发现自己在 R6 中编写了一些东西,在处理一些对象很有趣的同时,出现了一个有趣的问题。创建私有方法(例如 bar 的 foo)并在其他公共方法中调用它时,如果我使用以下方法调用它,它就会起作用:
self$foo
和
private$foo
我要问的是:这两种在 R6 中调用方法的方式有什么区别? 提前谢谢!
【问题讨论】:
最近我发现自己在 R6 中编写了一些东西,在处理一些对象很有趣的同时,出现了一个有趣的问题。创建私有方法(例如 bar 的 foo)并在其他公共方法中调用它时,如果我使用以下方法调用它,它就会起作用:
self$foo
和
private$foo
我要问的是:这两种在 R6 中调用方法的方式有什么区别? 提前谢谢!
【问题讨论】:
来自“R6 课程简介”小插图(重点是我的):
self
类的内部方法,
访问self指的是对象。 Public 对象的成员(到目前为止您所看到的)都可以通过self$x
private
公共成员使用
self访问,如self$add(),私人成员 使用private访问,如private$queue。
因此,即使您可以通过self 访问私有方法,您也应该通过private 进行访问。不要依赖可能会消失的行为,看看文档是如何说它不应该那样工作的。
也就是说,我无法使用 self 访问私有方法:
library(R6)
bar <- R6Class("bar",
private = list(
foo = function() {
message("just foo it")
}
),
public = list(
call_self = function() {
self$foo()
},
call_private = function() {
private$foo()
}
)
)
b <- bar$new()
b$call_private()
# just foo it
b$call_self()
# Error in b$call_self() : attempt to apply non-function
【讨论】: