10

在定义类时,R 是否有私有与公共插槽的概念?

如果语言中对此没有严格的特性,是否有通用的命名方案?

4

1 回答 1

14

编辑 :

提供一点历史:在 setClass 函数中,提供了一个选项“访问”来创建所谓的“特权插槽”,只能通过类提供的 getter 和 setter 访问。这将允许创建私有插槽(通过不提供 getter),但此功能从未实现。当前的帮助页面为?setClass

访问权限和版本,包括与 S-Plus 的兼容性,但目前被忽略。


所以没有私有和公共插槽之类的东西,因为通过@符号每个插槽都是可以访问的。就我个人而言,我对此非常满意,因为它允许我使用通过使用包中包含的 getter 和 setter 无法轻松访问的对象的信息。它还允许我通过避免 getter 和 setter 产生的开销来节省繁重的计算。

我不知道有任何命名约定来区分公共和“私人”插槽。您可以通过在“私有”插槽前面加上一个点来为自己做出区分,但这对插槽的行为方式没有影响。这也不是常见的做法,因为大多数 R 程序员并不关心公共和私有插槽。他们只是不为普通用户不应该访问的插槽提供 getter 和 setter。

举一个简单的例子:下面创建一个有两个槽的类,以及一个只有一个槽的 getter 和 setter。

setClass("Example",
  representation(
    aslot = "numeric",
    .ahiddenslot = "character"
  )
)

setGeneric("aslot", function(x) standardGeneric("aslot"))

setMethod("aslot","Example",function(x){
    x@aslot
})

setGeneric("aslot<-", function(x,value) standardGeneric("aslot<-"))

setMethod("aslot<-","Example",function(x,value){
    x@aslot <- value
    x
})

您还可以设置一个show不打印隐藏插槽的方法:

setMethod("show","Example",function(object){
  cat("Example with value for aslot: ", object@aslot,"\n")
})

这给出了以下正常使用:

> X <- new("Example",aslot=1,.ahiddenslot="b")
> X
Example with value for aslot:  1 
> aslot(X)
[1] 1
> aslot(X) <- 3

但是 .ahiddenslot 仍然可以访问:

> slot(X,".ahiddenslot")
[1] "b"
于 2012-05-25T14:08:24.133 回答