2010-12-13 2 views
1

나는 루비를 배우고 있는데, 이것은 내가 가진 경우이다.stdlib의 루비 싱글 톤. 인스턴스를 죽이는 방법

require 'singleton' 
class Lab 
    include Singleton 
    def initialize 
    puts 'initializing' 
    end 
end 

l1 = Lab.instance 
l2 = Lab.instance 

Lab.instance를 두 번 수행했지만 "초기화 중"메시지는 한 번만 표시됩니다. 그것은 싱글 톤이 작동하고 있음을 의미합니다. 큰!

레일은 개발 모드에서 const_remove를 사용하여 모든 상수를 제거하므로 다음 요청 모델 및 컨트롤러에서 다시로드됩니다.

나는 여기 비슷한 것을 시도하고 싶다. 나는 l1과 l2를 모두 없애기 때문에 Lab.instance를 할 때 새로운 인스턴스가 만들어지고 "초기화 중"이라는 메시지가 나타납니다.

내가 원하는 것을 성취 할 수있는 방법이 있습니까?

감사

답변

1

이 그냥 생각,하지만 어떻게 자신의 싱글 모듈을 구현하는 방법에 대한?

module MyLittleSingleton 
    def instance(*args, &block) 
    @instance ||= new(*args, &block) 
    end 
    def reload_instance! 
    @instance = nil 
    end 
end 

class Lab 
    extend MyLittleSingleton 
end 

정상적인 싱글 톤과 동일한 "안전성"을 제공하지는 않지만 필요한 것일 수 있습니다. 당신이 싱글의 새로운 인스턴스를해야하는 경우

+0

을 자신의 물건은 항상 마지막 수단으로입니다 롤링. 제안 및 코드 예제에 감사드립니다. –

0

, 당신이 사용할 수있는 익명의 하위 클래스를 (예를 들어, 다른 테스트에 영향을주지 않고 검사 도중 함께 재생) :

Lab.instance # This writes "initializing" 

MyLab = Class.new(Lab) 

MyLab.instance # This writes "initializing" 
MyLab.instance # This writes nothing 

경우 정말

Lab.instance # This writes "initializing" 

# Do it at your own risks 
Singleton.__init__(Lab) 

Lab.instance # This writes "initializing" 
Lab.instance # This writes nothing 
1

싱글 톤 믹스 인이 매우 간단한을 사용하면 다음 작업을 수행 할 수 있습니다, 당신의 싱글을 재설정 할 수 있지만이 경고 영역를 입력, 그것은 공개 API의 일부가 아니다 메커니즘을 쉽게 다시 구현할 수 있습니다. 핵심을 살펴보면 캐시 용으로 인스턴스 변수 @singleton__instance__을 사용한다는 것을 알 수 있습니다. 따라서이 변수를 재설정하면 작업을 수행해야합니다. 당신이 당신의 클래스에이 클래스의 메소드를 추가하려고하면 따라서 :

def self.reset 
    @singleton__instance__ = nil 
end 

당신은 할 수 있습니다 :

l1 = Lab.instance #=> initializing 
l2 = Lab.instance #=> nothing 
Lab.reset 
l3 = Lab.instance #=> initializing 
l4 = Lab.instance #=> nothing