0

假设我有以下课程:

class MyClass

  @@instances = []
  def initialize
    @@instances << self
  end#def

  def delete
    @@instances.delete(self)
    #what now??
    self.replace nil #doesn't do the trick
  end#def

end#class

我想做以下事情:

o = MyClass.new
o.delete

并将执行. o_ 有任何想法吗?nildelete

4

3 回答 3

1

如果您想获取 的所有实例的数组MyClass,您需要做的就是

ObjectSpace.each_object(MyClass).to_a

如果您想销毁未在其他任何地方引用oMyClass给定实例o,那么o请引用其他内容

o = nil

稍后,该对象将被垃圾回收。

于 2012-12-05T15:47:47.153 回答
0

正如上面的尤里卡指出的那样,这是不可能的。但是,您可以实现类似的语义:

class MyClass
  def delete
    ....
    is_deleted
  end

  def is_deleted
     check_some_conditions
  end
end

然后,您的语法将是:

o = MyClass.new
if o.delete.is_deleted
  ...
end

您也可以覆盖nil?,但我不建议这样做,因为它可能会使使用您的代码的人感到困惑。

于 2012-12-05T15:24:03.183 回答
0

一种可能是:

vars = Kernel.global_variables + Kernel.local_variables
vars.map{|var| var=nil if var == self}

但是,我不认为这是一个聪明的...

编辑:不,一点也不聪明

于 2012-12-05T15:54:27.863 回答