2013-05-28 24 views
1

我學習Ruby和還沒有找到一種方法來覆蓋等效object.delete功能的缺失運行方式:上的對象

這是怎麼了,我這樣做:

class Foo 
     @@no_foo=0 
     def initialize 
      @@no_foo+=1 
     end 
     def delete 
      #class specific cleanup... 
      @@no_foo-=1 
     end 
     def Foo.no_foo 
      return "#@@no_foo" 
     end 
    end 

    def delete(obj) 
     #object independent cleanup... 
     obj.delete 
     return nil 
    end 

    foo1 = Foo.new 
    foo2 = Foo.new 

    puts Foo.no_foo 

    puts foo2 
    foo2 = delete(foo2) 
    puts foo2 

    puts Foo.no_foo 

正如你可以看到,這是一個有點冒險的方式去做事情... 有沒有更簡單的方法來解決這個問題?
基本上我想讓我的對象在同一個調用中不可訪問,就像減少那個類的總計數器一樣。 我無法找到將變量(指向對象的指針)設置爲nil時調用的方法。

我發現沒有辦法刪除一個對象。

+2

我不明白,你有什麼具體的要求。但你可以看看這裏 - ['WeakRef'](http://www.ruby-doc.org/stdlib-2.0/libdoc/weakref/rdoc/WeakRef.html)。 –

+1

@Ruby喜歡,WeakRef似乎是最簡單的方法來完成我想要實現的。 – hamhut1066

+0

好的!那就好!因此,如果該庫幫助您實現目標,那麼請在此處發佈最終代碼,以便將來的用戶可以通過查看它的優勢。 –

回答

1

根據@RubyLovely提供的鏈接:WeakRef
我總結了以下示例類:

require 'weakref' 
    class Foo 
    #block to excecute on GC.start... 
    FINALIZER = lambda { |object_id| p "finalizing %d" % object_id; @@no_foo -=1 } 

    @@no_foo=0 
    def initialize 
     @@no_foo+=1 
     #Initialising the finalizer... 
     ObjectSpace.define_finalizer(self, FINALIZER) 
    end 

    def Foo.no_foo 
     @@no_foo 
    end 
end 

foo = Foo.new 
foo = WeakRef.new(foo) 
puts Foo.no_foo 

GC.start 

puts Foo.no_foo 
1

即使ruby沒有顯式析構函數,它也支持終結器。 Finalizer是一個當你的對象被垃圾收集時被調用的代碼。

class Foo 
    @@no_foo = 0 

    def initialize 
    @@no_foo += 1 
    ObjectSpace.define_finalizer(self, Foo.method(:delete)) 
    end 

    def self.delete id # also this argument seems to be necessary 
    @@no_foo -= 1 
    end 

    def self.no_foo 
    @@no_foo 
    end 
end 

似乎你將無法在終結器中執行特定於實例的清理。它必須完全脫離實例才能正常工作。這裏有答案可能也會幫助你:answer,answer

+0

@Ruby善良:這是必要的嗎?這個問題需要澄清。這裏只會混淆,恕我直言 –

+0

不!你無法說話。做你認爲好的。 –

+0

這是我以前發現的,但我還沒有完全理解它。看起來,當Object被銷燬時,終結器不會被調用,而是當它被垃圾收集時。 – hamhut1066