2011-02-06 4 views
4

Ruby에서 Foo라는 클래스는 class Foo으로 정의되며, require 'foo'을 통해 사용되며 $:[0]/foo.rb 또는 그와 비슷한 형태로 존재합니다.Ruby에서 어떻게 계층 적 클래스 이름을 만드나요?

하지만 무엇에 대해 Foo::Bar? require 'foo/bar'으로 전화를 걸겠습니까? $:[0]/foo/bar.rb에 살고 싶습니까? 어떻게 정의 될까요?

나는 매우 개인적인 프로젝트를 위해 내가 다음 package Project::Text::Index 시작할 것이다, Project/Text/Index.pm 같은 파일을 만들 것, 그리고 use Project::Text::Index;를 통해 호출 할 수 Project::User, Project::Text::Index, Project::Text::Search 등과 같은 중첩 된 클래스를 만들 것 펄에 사용하고있다.

이제 Ruby에서 프로젝트를 시작하고이를 수행하는 방법을 모릅니다. 웬일인지 루비 책이나 필자가 읽은 문서 중 펄 스타일의 계층 적 클래스 이름에 대해서는 언급하지 않았다. 그들이 상속을 언급 할 때 그것은 보통 나를 돕지 않는 class Foo < Bar과 같은 사소한 예를 통해 이루어진다. 그러나 Rails가 단지 하나의 예제를 취하기 때문에 ActionView::Helpers::ActiveModelFormBuilder과 같은 클래스를 가지고 있기 때문에 내가 시도하고있는 것을 수행 할 수 있어야한다고 생각한다.

답변

6

로드 경로, 상속 및 범위 분석 연산자와 관련되지 않은 몇 가지 개념을 여기에 결합했습니다.

파일을 필요로 할 때 (또는로드 할 때) require 키워드의 인수는 단순히 파일 경로로 사용되며로드 검색 경로에 추가됩니다 (.rb 확장자는 require의 경우 선택 사항 임). 예상하지만, 범위 결정 연산자를 사용하여 해결로

require 'foo' # Looks for "foo.rb" in each of $: 
require 'foo/bar' # Looks for "foo/bar.rb" in each of $: 

상자의 클래스 (및 모듈, 변수 등) 정의 : 예는, 상속 및 중첩 여기에서 활동하기 시작하지 않고 모든 파일은 원하는 것을 정의 할 수 있습니다 예 :

class Foo 
    def foo; 'foo'; end 
    class Bar 
    def bar; 'bar'; end 
    end 
end 
Foo.new.foo # => "foo" 
Foo::Bar.new.bar # => "bar" 

클래스 중첩과 상속은로드 된 파일의 위치와 관련이 없습니다. 클래스/모듈 구조에 대한 명시적인 규칙이없는 것처럼 보이므로 자유롭게 사용할 수 있습니다. Programming Ruby 책의 Ruby Language 페이지도 도움이 될 것입니다.

3

모듈이 필요합니다. 당신은 클래스가 Funthing/Text/Index.rbFunthing::Text::Index에 의해 식별 require 'Funthing/Text/Index'에 필요한 싶은 경우에, 당신은이 작업을 수행 :

# file Funthing/Text/Index.rb 
module Funthing 
    module Text 
    class Index 
     def do_the_twist() 
     puts "Let's twist again!" 
     end 
    end 
    end 
end 

은 다음과 같이 사용 :

require "Funthing/Text/Index" 
c = Funthing::Text::Index.new 

참고 : 파일 계층 구조 하지입니다 필요하지만, (제 생각에는) 모범 사례입니다.

+2

좋은 답변이지만 파일 이름 (및 필수)은 funcase/text/index.rb이어야합니다. – tokland

+0

모듈 내부의 클래스 중첩과 클래스 내부 중첩의 차이에 대한 의견이 있으십니까? 이 모듈 예제는 클래스 정의로만 주어질 수 있습니다. –