2012-12-05 89 views
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 

而且onildelete執行。有任何想法嗎?

+4

這是不可能的:您只能修改對象本身,而不是'o',它是對它的引用,並且不能從'delete'方法訪問。 – Eureka

回答

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?但我不建議這樣做,因爲它可能會使用你的代碼迷惑人。

+0

@ user1130886你是什麼意思? – Candide

+0

對不起,剛習慣在StackOverflow上寫評論。以爲我正在寫一個答案,而不是一個評論 – KenGey

1

如果你想獲得的MyClass所有實例的數組,所有你需要做的是

ObjectSpace.each_object(MyClass).to_a 

如果你想消滅實例的MyClasso因爲o沒有提及其他地方,然後讓o參考其他

o = nil 

的東西在一段時間後,該對象將被垃圾收集。

0

一種可能性是:

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

但是,我不認爲這是一個聰明的一個...

編輯:不,不聰明都

+0

非常有趣。但是,即使內核不知道它,也就是說,在執行上下文中仍然存在對該對象的引用。 – Candide