Ruby에서 include와 require의 차이점은 무엇입니까?
내 질문은 " Ruby의 include와 extend의 차이점은 무엇입니까? " 와 비슷합니다 .
루비 require
와 의 차이점은 무엇입니까 include
? 내 클래스의 모듈에서 메소드를 사용하고 싶을 require
때 아니면 사용해야 include
합니까?
Ruby에서 "include"와 "require"의 차이점은 무엇입니까?
대답:
include 및 require 메소드는 매우 다른 작업을 수행합니다.
require 메소드는 대부분의 다른 프로그래밍 언어에서 include 기능을 수행합니다. 다른 파일을 실행하십시오. 또한 과거에 필요한 것을 추적하며 동일한 파일을 두 번 요구하지 않습니다. 이 추가 기능없이 다른 파일을 실행하려면로드 방법을 사용할 수 있습니다.
include 메소드는 다른 모듈에서 모든 메소드를 가져 와서 현재 모듈에 포함시킵니다. 이것은 require와 마찬가지로 파일 수준과 반대되는 언어 수준입니다. include 메소드는 다른 모듈 (일반적으로 믹스 인이라고 함)과 함께 클래스를 "확장"하는 기본 방법입니다. 예를 들어, 클래스가 "each"메소드를 정의하는 경우 믹스 인 모듈 Enumerable을 포함하고 콜렉션으로 작동 할 수 있습니다. 포함 동사가 다른 언어에서는 매우 다르게 사용되므로 혼동 될 수 있습니다.
따라서 모듈을 확장하거나 믹스 인하는 대신 모듈을 사용하려면을 사용하십시오 require
.
이상하게도 Ruby require
는 C와 유사 include
하지만 Ruby include
는 C와 거의 다릅니다 include
.
메타 프로그래밍 루비 책에서
이
require()
방법은과 매우 유사load()
하지만 다른 목적으로 사용됩니다. 당신이 사용하는load()
코드를 실행하고, 당신이 사용하는require()
라이브러리를 가져올 수 있습니다.
모듈을 사용하는 경우 모든 메소드를 클래스로 가져옵니다. extend
모듈 이 있는 클래스라면 모듈의 메소드를 클래스 메소드 로 "반입"한다는 의미 입니다. include
모듈 이 있는 클래스라면 모듈의 메소드를 인스턴스 메소드 로 "반입"한다는 의미 입니다.
전의:
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에 대해 정의되지 않은 메소드 'say'
B.new.say
=> 이것은 모듈 A입니다
C.say
=> 이것은 모듈 A입니다
C.new.say
=> C : Class에 대해 정의되지 않은 메소드 'say'
루비
require
는 다른 언어 (예 : C)에서 "include"와 비슷합니다. 루비에게 다른 파일의 내용 을 가져오고 싶다고 알려줍니다 . 다른 언어로 된 유사한 메커니즘은 다음과 같습니다.Ruby
include
는 mixin에 사용되는 객체 지향 상속 메커니즘 입니다.
여기에 좋은 설명이 있습니다 .
간단한 대답은 요구와 포함이 본질적으로 관련이 없다는 것입니다.
"필수" 는 C 포함과 유사하며 초보자 혼동을 일으킬 수 있습니다. (필요한 차이점 중 하나는 필요한 파일 내부의 로컬 사용자가 필요할 때 "증발"한다는 것입니다.)
Ruby include 는 C include와 다릅니다 . include 문은 모듈을 클래스에 "혼합"합니다. 다중 상속 의 제한된 형태입니다 . 포함 된 모듈은 말 그대로 "is-a"관계를 포함합니다.
강조가 추가되었습니다.
require
모듈 을 사용해 본 적이 있습니까? 결과는 어땠습니까? 단지 시도:
MyModule = Module.new
require MyModule # see what happens
모듈은 필요하지 않으며 포함되어 있습니다!
Ruby 1.9 프로그래밍 에서
계속하기 전에 include 문에 대해 몇 가지 사항을 설명하겠습니다. 첫째, 파일과 관련이 없습니다. C 프로그래머는 컴파일 중에 한 파일의 내용을 다른 파일에 삽입하기 위해 #include라는 전처리 지시문을 사용합니다. Ruby include 문은 단순히 모듈을 참조합니다. 해당 모듈이 별도의 파일에있는 경우 include를 사용하기 전에 require (또는 덜 일반적으로 사용되는 사촌,로드)를 사용하여 해당 파일을 끌어 와야합니다. 둘째, Ruby include는 단순히 모듈의 인스턴스 메소드를 클래스에 복사하지 않습니다. 대신 클래스에서 포함 된 모듈을 참조합니다. 여러 클래스가 해당 모듈을 포함하면 모두 같은 것을 가리 킵니다. 프로그램이 실행되는 동안에도 모듈 내에서 메소드의 정의를 변경하면 해당 모듈을 포함하는 모든 클래스에 새로운 동작이 나타납니다.
포함 아래에 표시된대로 모듈을 클래스에 포함 시키면 마치 모듈 내에 정의 된 코드를 가져 와서 '포함'하는 클래스에 삽입 한 것과 같습니다. '믹싱'동작을 허용합니다. 예를 들어 모듈 내에 동일한 코드가 필요한 여러 클래스가있는 경우 중복을 피하기 위해 코드를 건조하는 데 사용됩니다.
로드로드 방법은 해당 라이브러리가로드되었는지 여부를 추적하지 않는다는 점을 제외하면 require 메소드와 거의 같습니다. 따라서 라이브러리를 여러 번로드 할 수 있으며로드 방법을 사용할 때 라이브러리 파일 이름의 ".rb"확장자를 지정해야합니다.
Require require 메소드를 사용하면 라이브러리를로드하고 라이브러리가 두 번 이상로드되는 것을 방지 할 수 있습니다. require 메소드는 처음 동일한 라이브러리를로드하려고하면 'false'를 반환합니다. 로드하는 라이브러리가 별도의 파일에 정의 된 경우 (필요한 경우) require 메소드 만 사용해야합니다.
이 http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/를 선호 할 수 있습니다
require(name)
bolean true / false를 리턴합니다.
require에 매개 변수로 전달 된 이름, ruby는로드 경로에서 해당 이름의 소스 파일을 찾으려고 시도합니다. require 메소드는 처음 동일한 라이브러리를로드하려고하면 'false'를 반환합니다. 로드하는 라이브러리가 별도의 파일에 정의 된 경우 require 메소드 만 사용해야합니다. 따라서 해당 라이브러리가 이미로드되었는지 여부를 추적합니다.
include module_name
두 개의 다른 클래스에 필요한 메소드가 있다고 가정하십시오. 그런 다음 두 수업에서 모두 쓸 필요는 없습니다. 대신 할 수있는 일은 모듈에서 정의하는 것입니다. 그런 다음이 클래스를 다른 클래스에 포함 시키십시오. DRY 원칙을 보장하기 위해 Ruby에서 제공합니다. 중복을 피하기 위해 코드를 건조하는 데 사용됩니다.
포함
때
include
당신이 모듈 내에 정의 된 코드를 가지고 가고 당신이 그것을 '포함'클래스 내에서 그것을 삽입 된 것처럼 클래스에 모듈, 그것은이다. '믹싱'동작을 허용합니다. 예를 들어 모듈 내에 동일한 코드가 필요한 여러 클래스가있는 경우 중복을 피하기 위해 코드를 건조하는 데 사용됩니다.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
include Log
# ...
end
tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error
필요
require 메소드를 사용하면 라이브러리를로드 할 수 있으며 라이브러리가 두 번 이상로드되지 않습니다. require 메소드는 처음 동일한 라이브러리를로드하려고하면 'false'를 반환합니다. 로드하는 라이브러리가 별도의 파일에 정의 된 경우 (필요한 경우) require 메소드 만 사용해야합니다.
따라서 해당 라이브러리가 이미로드되었는지 여부를 추적합니다. 라이브러리 파일 이름의 ".rb"확장자를 지정할 필요도 없습니다. 다음은 require를 사용하는 방법의 예입니다. require 메소드를“.rb”파일 맨 위에 놓으십시오.
하중
로드 방법은 라이브러리가로드되었는지 여부를 추적하지 않는다는 점을 제외하고는 require 메소드와 거의 같습니다. 따라서 라이브러리를 여러 번로드 할 수 있으며로드 방법을 사용할 때 라이브러리 파일 이름의 ".rb"확장자를 지정해야합니다.
넓히다
include 대신 extend 메소드를 사용하는 경우 모듈 메소드를 인스턴스 메소드 대신 클래스 메소드로 추가합니다.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
extend Log
# ...
end
tc = TestClass.class_type
다음은 require와 include 사이의 몇 가지 기본 차이점입니다.
요구 사항 :
- Require는 파일 시스템에서 파일을 읽고, 구문 분석하고, 메모리에 저장 한 후 지정된 위치에서 파일을 실행합니다. 즉, 스크립트가 실행 중일 때 변경 사항이 반영되지 않는 것보다 변경 사항이있는 경우에도 마찬가지입니다.
- 모듈 이름이 아닌 이름으로 파일이 필요합니다.
- 일반적으로 라이브러리 및 확장에 사용됩니다.
포함:
- 모듈을 클래스에 포함 시키면 모듈에 정의 된 코드를 가져 와서 클래스에 삽입 한 것처럼 동작합니다.
- 파일 이름이 아닌 모듈 이름을 포함합니다.
- 일반적으로 코드를 정리하고 코드에서 중복을 제거하는 데 사용됩니다.
'development' 카테고리의 다른 글
Turing Complete 란 무엇입니까? (0) | 2020.02.16 |
---|---|
파일의 특정 줄에 대한 커밋 로그를 검색 하시겠습니까? (0) | 2020.02.16 |
N 번 반복 된 단일 항목 목록 만들기 (0) | 2020.02.16 |
함수의 존재를 확인하기 위해 템플릿을 작성할 수 있습니까? (0) | 2020.02.16 |
.NET에서 콘솔 응용 프로그램의 종료 코드를 어떻게 지정합니까? (0) | 2020.02.16 |