我在课程中有以下示例代码
makeVector <- function(x = numeric()) {
m <- NULL
set <- function(y) {
x <<- y
m <<- NULL
}
get <- function() x
setmean <- function(mean) m <<- mean
getmean <- function() m
list(set = set, get = get,
setmean = setmean,
getmean = getmean)
}
但是,我不明白最后一个列表功能的重要性。有人可以解释一下吗?谢谢。
答案 0 :(得分:1)
对list()
的最终调用构建一个新的列表对象并从makeVector()
返回它(因为它是函数中的最后一个语句)。
新列表对象填充了四个组件:set
,get
,setmean
和getmean
。这四个组件中的每一个的值都填充了一个在执行makeVector()
函数期间动态定义的函数。
所有这四个函数都有点特别之处在于它们最终将共享一个指向执行环境的指针,该指针在makeVector()
函数执行该特定的自身调用时生效。因为它们不同地读取和写入该调用的本地变量x
和m
,所以它们最终都将这些变量共享为伪私有变量。这是面向对象编程功能模式的一种实现,其中临时局部变量由临时范围内的一组新动态定义函数关闭。这种模式可以用各种语言看到,包括R,Perl和JavaScript。
另请注意,共享变量的可写性仅起作用,因为超级运算符(<<-
)用于从动态mutator函数(set()
和{{1}的范围分配它们})。如果使用了正常赋值运算符(setmean()
),那么在调用它时动态mutator函数本身的范围内将临时创建一个新的局部变量,这不会影响闭包变量。