我今天早些时候正在查看一些代码(https://www.r-bloggers.com/building-your-own-blockchain-in-r/),其中有人以我从未见过的方式定义 S3 函数并且喜欢这种视觉风格,但从未在 R 代码的其他任何地方看到过它,并想弄清楚原因。
他们定义了许多 S3 类,看起来像
my_class <- function(){
# set some attributes
inst <- list(foo = "bar")
# define a function
inst$change_foo <- function(what) {inst$foo <- what}
# get S3 class right
class(inst) <- "my_class"
inst <- list2env(inst)
inst
}
基本上,我觉得这个人试图让 R 的通用函数 S3 OO 系统看起来像更标准的消息传递 OO 系统(如 Python、Java 等),其中方法属于类。
我的感觉是,这在 R 中可能是不好的做法,因为
baz <- my_class()
baz$change_foo("baz")
并没有真正做到你认为的那样。诚然,我的理解是,在其他面向对象的语言中,baz$change_foo
实际上是绑定到的那个实例my_class
,所以它总是编辑baz
.
在 R 中,该绑定实际上并没有发生,因此定义inst
中的可能会发现与它恰好在环境中不同的情况。my_class
inst
baz
只有这个list2env
调用才能让这里的事情保持整洁,在一个更复杂的例子中可能会搞砸。
我确实喜欢这段代码在视觉上封装函数的方式my_class
,所以我很好奇我是否在这里做一些事情,或者我是否正在全力以赴。Stack Overflow 的居民们,你们怎么说?这是好还是坏的风格?