다른 파일의 사용

성능을 측정하는 작은 프로그램 같은 경우라면 파일 하나에 프로그램 코드를 전부 넣어도 괜찮을 것입니다. 하지만 규모가 커진다면 여러 파일에 코드를 분리해 넣어야 유지보수 및 코드 이해에 문제가 없습니다.

require "..."를 통해 컴파일러가 다른 파일을 처리하도록 명령합니다. 이 표현식은 문자열 리터럴 하나를 인자로 받으며, 다양한 방법으로 사용될 수 있습니다.

파일이 require되고 나면, 컴파일러는 그 절대 경로를 기억해두었다가 같은 파일을 require하도록 요청받을 경우 그 요청을 무시합니다.

require "파일명"

require 경로에서 이름이 "filename"인 파일을 찾습니다.

require 경로란 컴파일러에 동봉되는 표준 라이브러리 위치와 (유닉스 셸에서 pwd로 얻을 수 있는) 현재 작업 디렉토리에 상대적인 "libs" 디렉토리를 의미합니다. 컴파일러는 이 경로만을 검색하게 됩니다.

검색은 다음 순서로 이루어집니다.

  • require 경로에 "filename.cr" 파일이 존재할 경우 그 파일이 포함됩니다.
  • "filename" 디렉토리가 존재하며 그 디렉토리 바로 아래에 "filename.cr" 파일이 있을 경우 그 파일이 포함됩니다.
  • 이외의 경우 컴파일 시간 오류가 발생합니다.

전형적인 프로젝트 구조를 가정하면, 두 번째 규칙은 아주 유용합니다.

- project
  - libs
    - foo
      foo.cr
    - bar
      bar.cr
  - src
    - project.cr
  - spec
    - project_spec.cr

require "./filename"

require 표현식을 포함하는 파일에 상대적인 경로에서 "filename"을 찾습니다.

검색은 다음 순서로 이루어집니다.

  • 현재 파일과 같은 경로에 "filename.cr" 파일이 존재할 경우 그 파일이 포함됩니다.
  • "filename" 디렉토리가 존재하며 그 디렉토리 바로 아래에 "filename.cr" 파일이 있을 경우 그 파일이 포함됩니다..
  • 이외의 경우 컴파일 시간 오류가 발생합니다.

이 상대 경로 표현식은 한 프로젝트에서 같은 경로에 있는 다른 파일을 참조하기 위해 주로 사용됩니다. specs에서 코드를 나타내기 위해 사용할 수도 있습니다.

# spec/project_spec.cr에서
require "../src/project"

기타 형태

두 경우 모두 중첩된 이름을 사용하여 중첩 디렉토리에서 이름을 찾게 됩니다.

  • require "foo/bar/baz"는 require 경로에서 "foo/bar/baz.cr" 또는 "foo/bar/baz/baz.cr"를 검색합니다.
  • require "./foo/bar/baz"는 현재 경로에서 "foo/bar/baz.cr" 또는 "foo/bar/baz/baz.cr"를 검색합니다.

"../"로 현재 경로의 상위 디렉토리에 접근할 수 있습니다. 따라서 require "../../foo/bar" 또한 하나의 방법입니다.

어떤 경우든 특수한 * 접미사와 ** 접미사를 사용할 수 있습니다.

  • require "foo/*"는 "foo" 디렉토리 안의 모든 ".cr" 파일을 포함하지만, "foo" 안의 디렉토리는 포함하지 않습니다.
  • require "foo/**"는 "foo" 디렉토리 안의 모든 ".cr" 파일을 포함하며, "foo" 안의 모든 디렉토리를 재귀적으로 포함합니다.

results matching ""

    No results matching ""