【问题标题】:Passing reference to Reference Class object between two other Reference Class objects (soccer example)在其他两个引用类对象之间传递对引用类对象的引用(足球示例)
【发布时间】:2013-02-09 10:04:00
【问题描述】:

我试图通过以下示例在其他两个参考类对象(例如,两个足球 [football] 球员)之间“传递”对参考类对象(例如,球)的引用:

# create Reference classes
b <- setRefClass('Ball', fields = list(size = 'numeric'))

    p <- setRefClass('Player', fields = list(name = 'character', possession = 'Ball'), 
methods = list(pass = function(){
        tmp <- possession$copy()
        possession <<- NULL
        return(tmp)
    }, receive = function(newBall){
        possession <<- newBall
} 
))


# initialize pretend all-star team
# p1 gets initial possession of a new ball
p1 <- p$new(name = 'Ronaldinho', possession = b$new(size=5) )

p2 <- p$new(name = 'Beckham')

# now pass the ball from p1 to p2
p2$receive(p1$pass())

但是我得到以下错误:

Error in function (value)  : 
  invalid replacement for field ‘possession’, should be from class “Ball” or a subclass (was class “NULL”)

理论上我正在尝试重新引用对球对象的引用,然后将该引用添加到其他玩家,但显然这不起作用。我知道可以通过直接访问字段来获得相同的结果,但是我想找到一种方法来仅使用类的内部方法来完成此“通过”。这可能吗?为什么会出现此错误?

【问题讨论】:

  • 请编辑您的问题。 S3、S4 或 Reference Classes 的作者都不像您在此处为后者使用的术语。这个词已经传播得够多了,让我们停止它。它们被称为“参考类”。
  • 我不知道围绕这些课程的名称存在争议。我从非常有用的介绍中得出该术语:hadley's R5 wiki。如果这不是正确的术语,很高兴更改它。
  • 我一直hard 依赖 Hadley,以免进一步宣传这个词。他开始出现了。
  • 围绕类命名的困惑/争论是什么?如果在“参考类”的其他地方有另一个易于 google 且简单明了的介绍,它可能会鼓励其他人使用替代名称。
  • 我编辑了 devtools wiki。至于为什么,看我的第一个回答。衷心感谢您编辑您的问题。

标签: r oop object pass-by-reference reference-class


【解决方案1】:

您可能会收到错误,因为在定义 Player 类时,您将 possession 字段设置为 Ball 类型。但是在您的pass 函数中,您将possession 设置为NULL:

possession <<- NULL

如果将初始化更改为:

p = setRefClass('Player', fields = list(name = 'character', possession = 'ANY')

然后一切都按预期进行:

R> p2$receive(p1$pass())
R> p1
Reference class object of class "Player"
Field "name":
[1] "Ronaldinho"
Field "possession":
NULL
R> p2
Reference class object of class "Player"
Field "name":
[1] "Beckham"
Field "possession":
Reference class object of class "Ball"
Field "size":
[1] 5

【讨论】:

  • 这很好用,谢谢!没有意识到类型变量不能接受NULL。很高兴知道!
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多