2013-12-20 3 views
2

, 당신은 다음과 같은 class << self 같은 관용구를 사용할 수 있습니다루비 : 그래서 루비 클래스에서 열기 모듈의 싱글

class SalesOrganization 
    def self.find_new_leads 
    ... 
    end 
    class << self 
    include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation 
    add_transaction_tracer :find_new_leads, :category => :task 
    end 
end 

내 질문 SalesOrganization 경우 실제로 Module 대신 Class의 인 것입니다. 이 일이 내가 원하는 일을하고있는 것입니까, 아니면 내가 손을 대지 말았어야하는 흑 마술을 열어 놓았습니까?

# Potentially terrible code 
module SalesOrganization 
     def self.find_new_leads 
     ... 
     end 
     class << self 
     include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation 
     add_transaction_tracer :find_new_leads, :category => :task 
     end 
end 

모듈 싱글 톤 클래스에 어떻게 액세스합니까?

답변

3

아니요, 당신은 흑 마술을 공개하지 않습니다. 당신의 방법 경우

module M 
    def self.b 
    "b" 
    end 
end 

M.b # => "b" 

module M 
    class << self 
    def c 
     "c" 
    end 
    end 
end 

M.c # => "c" 

또한 instance_eval를 사용할 수 있습니다

module M; end 

def M.a 
    "a" 
end 

M.a # => "a" 

를 사용해서도 작업을 제안 접근 : 당신은 모듈합니다 (Module 클래스의 인스턴스)를 포함하여 모든 개체에 싱글 방법을 정의 할 수 있습니다 물론

module M; end 

M.instance_eval <<EOF 
    def d 
    "d" 
    end 
EOF 

M.d # => "d" 

NewRelic... 같은 모듈은 C에 대한 가정을 할 수있다 : 정의는 런타임 때까지 알 수없는 lasses/modules가 포함되어 있기 때문에 조심해야합니다.

1

내가 보관하고 싶은 것을 이해했는지 확실하지 않습니다. 그러나 을 포함하는 정의를 모듈 B에 쓰고 싶다면

하여, 예를 들면
module B 
    def self.included(base) 
    base.include C 
    end 
end 

class A 
    include B 

    # use C 
end 

: 당신이 이런 식으로 할 수있는 것보다 그리고보다 것은 B 등 후 AC를 사용

module SalesOrganization 
    def self.included(base) 
    base.include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation 
    base.add_transaction_tracer :find_new_leads, :category => :task 
    end 


    def self.find_new_leads 
    ... 
    end 
end 

가 지금 포함하는 경우 그 클래스 클래스에 SalesOrganization 모듈 Newrelic이 포함됩니다.

+0

이것은 실제로 모듈의 싱글 톤 클래스를 여는 방법에 대한 원래 질문에 대답하지 않습니다. 나는 그 모듈을 어디서나 포함 된 메소드에 포함시키지 않을 것이다. 나는 지금 그것을 네임 스페이스로 사용하고있다. – randombits