r引用类 - 它们是否具有静态字段成员/变量?

时间:2012-11-09 06:45:37

标签: r reference-class

我一直在玩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)

如果运行此代码 - 您可以看到第二个字段变量似乎作为静态类成员运行。对我来说不太清楚的是引用类保留了这个字段(因此我的评论在上面的倒数第二行)。

1 个答案:

答案 0 :(得分:1)

基于哈德利上述评论的简短回答是否定的。 R的引用类没有静态变量。

相关问题