루비의 include와 require의 차이점은 무엇입니까?
제 질문은 "Ruby에 포함과 확장의 차이점은 무엇입니까?"와 유사합니다.
사이에 무슨 차이가 있습니까?require
그리고.include
루비에? 반, 내우모메사싶용다면고, ?require
그것 또는include
그것은?
루비에서 "포함"과 "필수"의 차이점은 무엇입니까?
답변:
포함 및 요구 방법은 매우 다른 작업을 수행합니다.
require 메서드는 대부분의 다른 프로그래밍 언어에서 를 포함하여 다른 파일을 실행합니다.또한 과거에 필요했던 내용을 추적하므로 동일한 파일을 두 번 필요로 하지 않습니다.이 추가 기능 없이 다른 파일을 실행하려면 로드 방법을 사용할 수 있습니다.
include 메서드는 다른 모듈에서 모든 메서드를 가져와 현재 모듈에 포함합니다.이것은 필요한 파일 수준의 것과 반대되는 언어 수준의 것입니다.포함 방법은 다른 모듈(일반적으로 믹스인이라고 함)을 사용하여 클래스를 "확장"하는 기본 방법입니다.예를 들어 클래스가 "각" 메서드를 정의하는 경우 혼합 모듈 Enumerable을 포함할 수 있으며 이를 컬렉션으로 사용할 수 있습니다.이것은 포함 동사가 다른 언어에서 매우 다르게 사용되기 때문에 혼란스러울 수 있습니다.
따라서 모듈을 확장하거나 믹스인하는 대신 모듈을 사용하려면require
.
의 이게도하, 의비루.require
C 유사와 include
루비가 있는 동안include
거와 C같 않습니다와는 다릅니다.include
.
모듈을 사용하는 경우 모든 메소드를 클래스로 가져오는 것입니다.네가 만약extend
모듈이 있는 클래스, 즉 모듈의 메서드를 클래스 메서드로 "도입"하는 것입니다.네가 만약include
모듈이 있는 클래스. 즉, 모듈의 메서드를 인스턴스 메서드로 "도입"하는 것입니다.
EX:
module A
def say
puts "this is module A"
end
end
class B
include A
end
class C
extend A
end
B.say
=>=> B:Class에 대해 되지 않은 메서드 입니다.
B.new.say
=>=> 모듈 입니다.
C.say
=>=> 모듈 입니다.
C.new.say
=>=> C:Class에 대해 되지 않은 메서드 입니다.
메타프로그래밍 루비 책에서,
그
require()
▁similar▁is와 상당히 합니다.load()
하지만 그건 다른 목적을 위한 것입니다.당신은 용자를 합니다.load()
코드를 실행하고, 당신은 사용합니다.require()
라이브러리를 가져옵니다.
비루
require
는 다른 언어(예: C)에서 "포함"에 더 가깝습니다.루비에게 다른 파일의 내용을 가져오라고 합니다.다른 언어에서도 유사한 메커니즘은 다음과 같습니다.using <namespace>
C#의 지시문입니다.import <package>
자바로
비루
include
는 믹스인에 사용되는 개체 지향 상속 메커니즘입니다.
여기에 좋은 설명이 있습니다.
[단순한 대답은 요구사항과 포함은 본질적으로 관련이 없다는 것입니다.
"require"는 C include와 비슷하여 초보자에게 혼란을 줄 수 있습니다. (한 가지 주목할 만한 차이점은 필요한 파일 내의 로컬이 필요할 때 "증발"한다는 것입니다.)
Ruby include는 C include와 전혀 다릅니다.include 문은 모듈을 클래스에 "혼합"합니다.그것은 제한된 형태의 다중 상속입니다.포함된 모듈은 말 그대로 그것을 포함한 것에 "있는 그대로" 관계를 제공합니다.
강조가 추가되었습니다.
Ruby 1.9 프로그래밍에서
계속하기 전에 포함 문구에 대해 몇 가지 요점을 말씀드리겠습니다.첫째, 파일과 관련이 없습니다.C 프로그래머는 컴파일 중에 #include라는 전처리기 지시어를 사용하여 한 파일의 내용을 다른 파일에 삽입합니다.Ruby include 문은 단순히 모듈을 참조합니다.해당 모듈이 별도의 파일에 있는 경우 include를 사용하기 전에 require(또는 사용 빈도가 낮은 사촌 로드)를 사용하여 해당 파일을 끌어와야 합니다.둘째, Ruby 포함은 단순히 모듈의 인스턴스 메서드를 클래스에 복사하지 않습니다.대신 클래스에서 포함된 모듈을 참조합니다.여러 클래스에 해당 모듈이 포함된 경우 모두 동일한 항목을 가리킵니다.프로그램이 실행되는 동안에도 모듈 내에서 메서드의 정의를 변경하면 해당 모듈을 포함하는 모든 클래스가 새 동작을 표시합니다.
당신은 시도해 본 적이 있습니까?require
모듈? ?결과는 어땠습니까?시도해 보십시오.
MyModule = Module.new
require MyModule # see what happens
모듈은 필요하지 않으며 포함되어 있습니다!
'로드' - 파일의 내용을 삽입합니다.(파일이 호출될 때마다 파일 구문 분석)
'Require' - 파일 구문 분석된 내용을 삽입합니다.(파일을 한 번 구문 분석하여 메모리에 저장)
'포함' - 모듈을 클래스에 포함하고 모듈 내부의 메서드를 클래스의 인스턴스 메서드로 사용할 수 있습니다.
'확장' - 모듈을 클래스에 포함하고 모듈 내부의 메서드를 클래스 메서드로 사용할 수 있습니다.
포함 아래 그림과 같이 클래스에 모듈을 포함할 때 모듈에 정의된 코드를 가져와 클래스에 삽입한 후 '포함'하는 것과 같습니다.'혼합' 동작을 허용합니다.예를 들어 모듈 내에 동일한 코드가 필요한 클래스가 여러 개 있는 경우 중복을 방지하기 위해 코드를 건조하는 데 사용됩니다.
로드 라이브러리가 로드되었는지 여부를 추적하지 않는다는 점을 제외하면 로드 방법은 거의 require 메서드와 유사합니다.따라서 라이브러리를 여러 번 로드할 수 있으며 로드 방법을 사용할 때도 라이브러리 파일 이름의 ".rb" 확장자를 지정해야 합니다.
Require - require 메서드를 사용하여 라이브러리를 로드할 수 있으며 라이브러리가 두 번 이상 로드되지 않도록 합니다.처음 이후에 동일한 라이브러리를 로드하려고 하면 require 메서드가 'false'를 반환합니다.로드 중인 라이브러리가 별도의 파일에 정의된 경우에만 require 메서드를 사용하면 됩니다.
이 http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/ 을 선호할 수 있습니다.
다음은 필수 항목과 다음 항목 간의 기본적인 차이점입니다.
요구 사항:
- Require는 파일 시스템에서 파일을 읽고 구문 분석한 후 메모리에 저장한 후 지정된 위치에서 실행합니다. 이는 스크립트가 실행되는 동안 변경 사항이 반영되지 않는 경우에도 변경 사항을 적용할 수 있는지 여부를 의미합니다.
- 우리는 모듈 이름이 아닌 이름으로 된 파일이 필요합니다.
- 일반적으로 라이브러리 및 확장에 사용됩니다.
포함:
- 클래스에 모듈을 포함하면 모듈에 정의된 코드를 가져와 클래스에 삽입한 것처럼 동작합니다.
- 파일 이름이 아닌 모듈 이름이 포함되어 있습니다.
- 일반적으로 코드를 건조하고 코드의 중복을 제거하는 데 사용됩니다.
require(name)
bollean true/false를 반환합니다.
require에 매개 변수로 전달되는 이름, ruby는 로드 경로에서 해당 이름의 소스 파일을 찾으려고 시도합니다.처음 이후에 동일한 라이브러리를 로드하려고 하면 require 메서드가 'false'를 반환합니다.로드할 라이브러리가 별도의 파일에 정의되어 있는 경우에만 require 메서드를 사용해야 합니다.따라서 라이브러리가 이미 로드되었는지 여부를 추적합니다.
include module_name
두 개의 다른 클래스에 필요한 몇 가지 방법이 있다고 가정합니다.그러면 두 수업 모두에서 쓰지 않아도 됩니다.대신 모듈에서 정의할 수 있습니다.그런 다음 이 모듈을 다른 클래스에 포함합니다.단지 DRY 원칙을 보장하기 위해 루비에서 제공하는 것입니다.중복을 방지하기 위해 코드를 건조하는 데 사용됩니다.
예:사용할 때require 'math'
당신은 글을 써야 합니다.Math::PI
하지만 당신이 사용할 때include 'math'
당신은 간단하게 쓸 수 있습니다.PI
.
언급URL : https://stackoverflow.com/questions/318144/what-is-the-difference-between-include-and-require-in-ruby
'programing' 카테고리의 다른 글
새 Android 단편을 인스턴스화하는 모범 사례 (0) | 2023.06.01 |
---|---|
Android 장치의 기본 전자 메일 주소를 가져오는 방법 (0) | 2023.06.01 |
URL/전화로 클릭할 수 있는 UI 레이블을 만드는 방법은 무엇입니까? (0) | 2023.06.01 |
스피너 텍스트 크기와 텍스트 색상을 변경하는 방법은 무엇입니까? (0) | 2023.06.01 |
인스턴스 메서드를 원숭이 패치할 때 새 구현에서 재정의된 메서드를 호출할 수 있습니까? (0) | 2023.06.01 |