我一直在玩R的R5级系统,看它能做什么,不能做什么。在那个过程中,我偶然发现了看起来像静态类字段成员(它似乎没有在文档中 - 但我可能错过了它)
[2014年更新]
警告!!! :以下代码不适用于R版> = 3.0
这篇文章,它的答案,尤其是评论,提供了有关R5 OO系统和R语言的有用见解和提醒。但是,培养直接使用R5类实例环境的习惯可能是个坏主意
[2014年底更新]
在以下代码中,第一个字段是实例字段变量的经典定义。第二个定义似乎是使用访问器方法创建静态类字段。我想知道这个用途是否是犹太教(或者我的代码示例只是巧合)。第三个字段用法使用访问器方法创建一个准私有即时字段变量。
assertClass <- function(x, className, R5check=FALSE) {
# simple utility function
stopifnot(class(x)[1] == className)
if(R5check) stopifnot(is(x, 'envRefClass'))
}
A <- setRefClass('A',
fields = list(
# 1. public, typed, instance field
myPublicInstanceVar = 'character',
# 2. this assignment appears static
# but if the field me.static.private
# was declared in the field list
# it would be a local instance var
myPrivateStaticVar = function(x) {
if (!missing(x)) {
assertClass(x, 'character')
me.static.private <<- x
}
me.static.private
},
# 3. quasi-private, typed, instance field
myPrivateInstanceVar = function(x) {
if (!missing(x)) {
assertClass(x, 'character')
.self$me.private <<- x
}
.self$me.private
}
),
methods = list(
initialize = function (c='default') {
myPublicInstanceVar <<- c
myPrivateStaticVar <<- c
myPrivateInstanceVar <<- c
}
)
)
# test instantiation
instance1.of.A <- A$new('first instance')
str(instance1.of.A)
instance2.of.A <- A$new('second instance')
str(instance1.of.A)
str(instance2.of.A)
instance3.of.A <- getRefClass('A')$new('third instance')
instance3.of.A$myPrivateStaticVar <- 'Third instance - changed'
print(instance1.of.A$myPrivateStaticVar)
print(instance2.of.A$myPrivateStaticVar)
print(instance3.of.A$myPrivateStaticVar)
str(instance1.of.A)
str(instance2.of.A)
str(instance3.of.A)
# but not really private ...
instance1.of.A$myPublicInstanceVar # works
instance1.of.A$me.static.private # DOES NOT WORK - where is this variable stored
instance1.of.A$me.private # works
# till death do us part
instance3.of.A <- NULL
gc()
str(instance1.of.A)
str(instance2.of.A)
str(instance3.of.A)
如果运行此代码 - 您可以看到第二个字段变量似乎作为静态类成员运行。对我来说不太清楚的是引用类保留了这个字段(因此我的评论在上面的倒数第二行)。
答案 0 :(得分:1)
基于哈德利上述评论的简短回答是否定的。 R的引用类没有静态变量。