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

他のどこにも参照されていないgivenのインスタンスoを破棄したい場合は、他の何かを参照しましょうMyClassoo

o = nil

しばらくすると、オブジェクトはガベージコレクションされます。

于 2012-12-05T15:47:47.153 に答える
0

1つの可能性は次のとおりです。

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

でも、それは巧妙なものではないと思います...

編集:いいえ、まったく賢くありません

于 2012-12-05T15:54:27.863 に答える
0

上記の Eureka が指摘しているように、これは実行できません。ただし、同様のセマンティクスを実装できます。

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 に答える