2017-11-07 1 views
0

Ruby gem을 사용하여 명령 행 유틸리티 (foo)의 기능을 래핑하려고합니다. 일부 기능을 다른 클래스로 추상화하려고 시도하지만 한 곳에서 응용 프로그램의 오류를 처리 할 수 ​​있도록 한 가지 방법으로 시스템을 호출하는 논리를 갖고 싶습니다.모듈 클래스를 통해 액세스 할 수있는 개인 모듈 메서드

난 쉽게 할 수있는 셔틀이 방법을 통해 실행 호출 후 보석

module Foo 
    def self.execute(*args) 
    exec('foo', *args) 
    # Pretend there is a lot more error handling etc. here 
    end 
end 

과의 주요 모듈에 방법을 정의하여 각 클래스를이 작업을 수행 할 수 있습니다

module Foo 
    class Bar 

    # Access via class method 
    def self.list_bars 
     Foo.execute('ls', 'bars') 
    end 

    # Access via instance method 
    def initialize 
     # Make a call to the system executable via the class method 
     Foo.execute('initialize', 'bar') 
    end 

    def config(*args) 
     Foo.execute('config', 'bar', *args) 
    end 
    end 
end 

이상적 그래도 Foo.execute 메소드 을 개인으로 만들고 싶습니다. 따라서 내 모듈의 공개 API는 단지 foo의 추상화입니다. Foo.executeprivate으로 표시하면 모듈의 다른 클래스 (분명히)에서 액세스 할 수 없습니다.

어떻게 Ruby 2.3에서이를 간결하게 처리 할 수 ​​있습니까?

네임 스페이스 목적으로 모듈 Foo 만 사용한다는 점도 유의해야합니다.

+2

'private'및 'protected'는 클래스 환경에서 더 잘 작동합니다. 모듈은 같은 방식으로 상속되지 않으므로 제한이 훨씬 엄격합니다. – tadman

답변

1

루비의 모듈은 메서드와 상수의 컨테이너입니다. 클래스는 모듈의 일부를 형성하고 상속하지 않는 모듈에 대해 아무것도 모릅니다. 그래서 거기에있을 수있는 모든 클래스에 대해 'Foo '에 대한 메소드를 사용할 수있는 방법은 없습니다.

이 방법을 사용하면 원하는 것을 얻을 수 있습니다.

module Foo 
    module CommandRunning 
    def execute(*args) 
     # ... 
    end 
    end 

    class Bar 
    include CommandRunning 

    def initialize 
     execute('initialize', 'bar') 
    end 
    end 
end 
+0

이것은 매우 도움이되었습니다. 나는 매우 비슷한 것을하는 것을 끝내었다. 감사! – Suever

관련 문제