Ruby에서 require_relative와 require의 차이점은 무엇입니까?
루비 require_relative
와 의 차이점은 무엇입니까 require
?
문서를 살펴보십시오 .
require_relative
명령문을require
포함하는 파일과 관련된 파일을로드 할 수 있도록 하여 내장 메소드 를 보완합니다require_relative
.예를 들어, "test"디렉토리에 단위 테스트 클래스가 있고 테스트 "test / data"디렉토리 아래에 해당 클래스에 대한 데이터가있는 경우 테스트 케이스에서 다음과 같은 행을 사용할 수 있습니다.
require_relative "data/customer_data_1"
require_relative
편리한 하위 집합입니다 require
require_relative('path')
같음 :
require(File.expand_path('path', File.dirname(__FILE__)))
if __FILE__
가 정의되어 있거나 LoadError
그렇지 않으면 발생합니다.
이것은 다음을 의미합니다.
require_relative 'a'
그리고require_relative './a'
받는 상대 필요로 현재 파일 (__FILE__
).결과는 호출자의 현재 디렉토리에 의존하지 않기 때문에 라이브러리 내부에서 필요할 때 사용하려는 것입니다.
eval('require_relative("a.rb")')
인상LoadError
때문에__FILE__
내부에 정의되어 있지 않습니다eval
.이것이 바로
require_relative
RSpec 테스트에서 사용할 수없는 이유eval
입니다.
다음 작업 만 가능합니다 require
:
require './a.rb'
현재 디렉토리에 상대적인 요구require 'a.rb'
검색 경로 ($LOAD_PATH
)를 사용하여 필요합니다. 현재 디렉토리 또는 경로와 관련된 파일을 찾지 않습니다.require_relative
문서에서 "파일 이름이 절대 경로로 해석되지 않는 경우"(예 :/
또는./
또는로 시작../
하는 경우) 에만 경로 검색이 발생한다고 문서에서 말하고 있기 때문에 불가능 합니다File.expand_path
.
다음 작업은 둘 다 가능하지만 require
짧고 효율적이므로 사용하고 싶을 것입니다.
require '/a.rb'
및require_relative '/a.rb'
모두 절대 경로를 필요로한다.
소스 읽기
문서가 명확하지 않은 경우 소스를 살펴 보는 것이 좋습니다 (문서의 소스를 전환). 어떤 경우에는 무슨 일이 일어나고 있는지 이해하는 데 도움이됩니다.
필요합니다 :
VALUE rb_f_require(VALUE obj, VALUE fname) {
return rb_require_safe(fname, rb_safe_level());
}
require_relative :
VALUE rb_f_require_relative(VALUE obj, VALUE fname) {
VALUE base = rb_current_realfilepath();
if (NIL_P(base)) {
rb_loaderror("cannot infer basepath");
}
base = rb_file_dirname(base);
return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level());
}
이를 통해 우리는
require_relative('path')
와 같다:
require(File.expand_path('path', File.dirname(__FILE__)))
때문에:
rb_file_absolute_path =~ File.expand_path
rb_file_dirname1 =~ File.dirname
rb_current_realfilepath =~ __FILE__
Ruby API에서 :
require_relative는 require_relative 문이 포함 된 파일과 관련된 파일을로드 할 수 있도록함으로써 내장 메소드 요구 사항을 보완합니다.
require를 사용하여 파일을로드 할 때 일반적으로 시스템에 올바르게 설치되어 액세스 가능한 기능에 액세스하는 것입니다. require는 프로젝트 코드 내에서 파일을로드하기위한 좋은 솔루션을 제공하지 않습니다. 이 기능은 개발 단계에서 테스트 데이터에 액세스하거나 외부에서 사용하지 않고 프로젝트 내부에서 "잠긴"파일에 액세스하는 데 유용 할 수 있습니다.
예를 들어, "test"디렉토리에 단위 테스트 클래스가 있고 테스트 "test / data"디렉토리 아래에 해당 클래스에 대한 데이터가있는 경우 테스트 케이스에서 다음과 같은 행을 사용할 수 있습니다.
require_relative "data/customer_data_1"
"test"나 "test / data"가 Ruby의 라이브러리 경로에 있지 않을 가능성이 높기 때문에 일반적인 요구 사항으로는 찾지 못합니다. require_relative는이 특정 문제에 대한 좋은 솔루션입니다.
로드중인 파일의 확장자 (.rb 또는 .so)를 포함하거나 생략 할 수 있습니다.
경로는 to_str에 응답해야합니다.
http://extensions.rubyforge.org/rdoc/classes/Kernel.html 에서 설명서를 찾을 수 있습니다 .
요약
사용하여 require
설치 보석에 대한
를 사용하여 require_relative
로컬 파일에 대한
require
를 사용하여 $LOAD_PATH
파일을 찾습니다.
require_relative
명령문을 사용하여 파일의 현재 위치를 사용합니다.
요구하다
요구 사항은 gem install [package]
해당 기능을 위해 시스템 어딘가에 패키지 를 설치 (예 :)해야합니다.
사용하는 경우 require
당신은 할 수 있습니다 "사용 ./
현재 디렉토리, 예를 들어, 한 파일에 대해"형식을 require "./my_file"
하지만 일반적인 또는 권장 방법이 아닙니다 당신은 사용해야합니다 require_relative
대신.
require_relative
이것은 단순히 'require_relative 문으로 파일의 위치에 상대적인'파일을 포함한다는 것을 의미합니다. 나는 일반적으로 파일을 "up"과 반대로 현재 디렉토리 트리에 "내"있어야하는 것이 좋습니다. 예를 들어 사용 하지 마십시오
require_relative '../../../filename'
불필요하고 취약한 종속성을 생성하는 경향이 있기 때문에 파일 시스템 내에서 (최대 3 개의 디렉토리 레벨) 그러나 디렉토리 트리 내에서 이미 '깊게'있는 경우에는 다른 디렉토리 트리 분기가 "위로"아래로 필요할 수 있습니다. 더 간단하게 는이 저장소 외부의 파일에 require_relative를 사용하지 마십시오 (2018 년 말 현재이 시점에서 사실상 표준 인 git을 사용한다고 가정).
require_relative 문과 함께 파일require_relative
의 현재 디렉토리 를 사용하십시오 (따라서 명령을 사용하는 현재 디렉토리 일 필요는 없습니다). 이렇게하면 경로는 항상 같은 방식으로 필요한 파일에 상대적이므로 "안정적"으로 유지 됩니다.require_relative
정답은 정확하지만 매우 기술적 인 것입니다. 루비를 처음 접하는 사람들에게는
require_relative
작성한 다른 파일에서 코드를 가져 오는 데 가장 많이 사용됩니다.
예를 들어 데이터가 ~/my-project/data.rb
있고 데이터 를 포함하려면 ~/my-project/solution.rb
어떻게해야합니까? 에 solution.rb
당신을 추가합니다 require_relative 'data'
.
이러한 파일이 동일한 디렉토리에있을 필요는 없습니다. require_relative '../../folder1/folder2/data'
유효합니다.
require
다른 사람이 작성한 라이브러리에서 코드를 가져 오는 데 가장 많이 사용됩니다.
예를 들어 active_support
라이브러리에 제공된 도우미 함수 중 하나를 사용하려면 어떻게해야 합니까? gem을 gem install activesupport
파일 에 설치 한 다음 파일 에 설치해야 합니다 require 'active_support'
.
require 'active_support/all'
"FooBar".underscore
다르게 말했다-
require_relative
파일을 호출하는 파일과 관련하여 특별히 지정된 파일이 필요합니다.require
$ LOAD_PATH에 포함 된 파일이 필요합니다.
방금 RSpec의 코드 require_relative
에 O (1) 상수 및 require
O (N) 선형 에 대한 의견 이 있습니다. 아마도 차이점은 require_relative
보다 선호하는 것 require
입니다.
Windows를 사용할 require './1.rb'
때 스크립트가 로컬 또는 매핑 된 네트워크 드라이브에서 실행되는 경우 사용할 수 있지만 UNC \ servername \ sharename \ folder 경로에서 실행하면 사용할 필요가 있음을 추가하고 require_relative './1.rb'
싶습니다. 다른 이유로 사용하십시오.
'development' 카테고리의 다른 글
임의의 행을 선택하는 가장 좋은 방법 PostgreSQL (0) | 2020.03.16 |
---|---|
세션이란 무엇입니까? (0) | 2020.03.16 |
GitHub에서 리포지토리의 이름을 바꾸려면 어떻게합니까? (0) | 2020.03.16 |
리눅스에서 기본 쉘 변경하기 (0) | 2020.03.16 |
디스크에 플롯을 이미지로 저장하는 방법은 무엇입니까? (0) | 2020.03.16 |