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 не имеют статических переменных.