2

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

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

4

1 回答 1

1

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

于 2012-11-10T03:02:11.373 回答