r ссылочные классы - есть ли у них статические члены / переменные поля?

Я немного поиграл с системой R5 класса R, чтобы увидеть, что она может и не может делать. В этом процессе я наткнулся на то, что выглядит как статические члены поля класса (чего нет в документации - но я мог бы его пропустить)

[Обновление 2014 года]
Предупреждение!!!: Следующий код не работает с версией R>= 3.0
Этот пост, его ответы и, в частности, комментарии дают полезную информацию и напоминания о OO-системе R5 и языке 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 ответ

Решение

Короткий ответ - основанный на комментариях Хэдли выше - нет. Справочные классы R не имеют статических переменных.

Другие вопросы по тегам