在大型项目中,我有时希望有一个标准化和严格的数据“对象”,这样数据的任何函数都可以自信地假定对象的许多属性,而只需断言对象属于预期的类。所以我很高兴发现了R6类,它似乎通过提供“私有”元素实现了这一点,如下所示:
library('R6')
Data = R6::R6Class("Data",
private = list(x = NA, y = pi),
public = list(
initialize = function(x, y) {
private$x = x
},
get = function(attribute) return(private[[attribute]])
)
)
data = Data$new(x = 5)
data$get('x')
data$get('y')这个get函数是一个技巧。我真正想要的是,data的属性可以简单地作为data$x或data[['x']]访问,同时仍然具有私有变量的防篡改特性。有没有更好的方法来实现这一点?
发布于 2018-05-09 01:16:13
我将简要总结一下what I learned here。因为R6类本质上是一个环境,所以base::lockBinding函数在这里是适用的:
library('R6')
Data = R6::R6Class("Data",
public = list(
x = NA,
y = pi,
initialize = function(x) {
self$x = x
lockBinding("x", self)
lockBinding("y", self)
}
)
)
data = Data$new(x = 5)
data$x
data$y因为x和y是锁定的,所以data$x = 5会根据需要抛出一个错误。
https://stackoverflow.com/questions/50222481
复制相似问题