2013-05-28 1 views
1

의 삭제에 방법을 실행내가 루비를 배우고와 동등한 <code>object.delete</code> 기능을 오버라이드 (override) 할 수있는 방법을 발견하지 않은 개체

이것은 어떻게 내가 그 일을하고있다 : 당신으로

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

@RubyLovely, 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

루비는 명시 적 소멸자가 없지만 finalizer를 지원합니다. 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 

finalizer에서 인스턴스 별 정리를 수행 할 수없는 것으로 보입니다. 제대로 작동하려면 인스턴스와 완전히 분리되어야합니다. 다음은 당신을 도울 수있는 대답입니다 : answer, answer.

+0

@RubyLovely : 그게 필요한가요? 명확히하기 위해 질문이 필요했습니다. 여기 혼동 될 것입니다, IMHO –

+0

아니오! 너는 말할 거리가 없다. 좋은 생각을하십시오. –

+0

이것은 이전에 발견 한 것이지만 완전히 이해하지 못했습니다. 개체가 소멸 될 때 파이널 라이저가 호출되지 않고 가비지 수집 될 때 파이널 라이저가 호출되는 것 같습니다. – hamhut1066

관련 문제