차이 무엇 use
과 import
?
주어진 컨텍스트를 현재 컨텍스트에 사용하기위한 간단한 메커니즘
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2
다른 모듈에서 함수 및 매크로를 가져옵니다.
한 가지 차이점은 import
특정 기능 / 매크로를 선택하고 use
모든 것을 가져 오는 것입니다.
다른 차이점이 있습니까? 언제 다른 것을 사용 하시겠습니까?
차이 무엇 use
과 import
?
주어진 컨텍스트를 현재 컨텍스트에 사용하기위한 간단한 메커니즘
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#import/2
다른 모듈에서 함수 및 매크로를 가져옵니다.
한 가지 차이점은 import
특정 기능 / 매크로를 선택하고 use
모든 것을 가져 오는 것입니다.
다른 차이점이 있습니까? 언제 다른 것을 사용 하시겠습니까?
답변:
import Module
Module
네임 스페이스 가 없는 모든 함수와 매크로를 모듈에 가져옵니다 .
require Module
매크로를 사용할 수는 Module
있지만 가져 오지는 않습니다. (함수 Module
는 항상 네임 스페이스로 제공됩니다.)
use Module
첫 번째 requires
모듈 다음에 __using__
매크로 를 호출합니다 Module
.
다음을 고려하세요:
defmodule ModA do
defmacro __using__(_opts) do
IO.puts "You are USING ModA"
end
def moda() do
IO.puts "Inside ModA"
end
end
defmodule ModB do
use ModA
def modb() do
IO.puts "Inside ModB"
moda() # <- ModA was not imported, this function doesn't exist
end
end
ModA.moda()
가져 오지 않은 상태 에서는 컴파일 되지 않습니다 ModB
.
그래도 다음은 컴파일됩니다.
defmodule ModA do
defmacro __using__(_opts) do
IO.puts "You are USING ModA"
quote do # <--
import ModA # <--
end # <--
end
def moda() do
IO.puts "Inside ModA"
end
end
defmodule ModB do
use ModA
def modb() do
IO.puts "Inside ModB"
moda() # <-- all good now
end
end
당신이 use
d와 같이 삽입 ModA
한 import
문장을 생성 했다 ModB
.
*.ex
파일과 defmodule
블록 인 모듈과 파일에서 iex REPL로 모듈을 가져 오는 방법 에 대해 혼란스러워합니다.
__using__
메소드가 use ModA
? ModB
올바른 예제에서 import를 사용하는 것이 합리적 입니까?
use
는 현재 모듈에 코드를 주입하기위한 것이며 import
함수를 가져 오는 데 사용됩니다. use
예를 들어 use Timex
모듈에 추가 할 때 Timex와 마찬가지로 함수를 자동으로 가져 오는 구현을 구축 할 수 있습니다. 내가 무엇을 의미하는지 알고 싶다면 timex.ex를 살펴보십시오 . use
'd 일 수있는 모듈
use
보다 일반적 이라고 말하는 것이 정확 import
합니까? 즉,의 기능 import
은 다음의 일부입니다.use
import
나는 당신이 구현할 수있는 말을 정확 알고하지 않는 한, 여전히 필요 import
로 use
혼자하지만, 가능하다면 나는 놀라지 않을 것이다. use
그래도 절대적으로 더 강력합니다. 예를 들어, 프로젝트 use
에서 매우 복잡한 작업을 수행 exprotobuf
하여 제한에 도달했는지 확인할 수 있습니다. 코드를 사용하여 모듈을 확장하고, 컴파일 타임에 코드를 실행하고, 모듈에 함수를 추가하는 등의 작업을 수행 할 수 있습니다. 기본적으로 import
매크로의 기능과 결합 합니다.
use
) 많이 사용합니다 . 초보자보다 읽기가 훨씬 쉽습니다 exprotobuf
.하지만 use
한계에 도달 exprotobuf
할 수 있으므로 얼마나 멀리 갈 수 있는지 보는 것이 유용 할 수 있습니다.
use
실제로 많은 작업을 수행하지 __using__
않고 지정된 모듈을 호출하기 만합니다 .
보기 «, 별칭을 요구하고, 수입» 불로 불사의 영약 관계자로부터 페이지 시작 안내서 :
# Ensure the module is compiled and available (usually for macros)
require Foo
# Import functions from Foo so they can be called without the `Foo.` prefix
import Foo
# Invokes the custom code defined in Foo as an extension point
use Foo
Elixir는 메타 프로그래밍 (코드를 생성하는 코드 작성)을위한 메커니즘으로 매크로를 제공합니다.
매크로는 컴파일 타임에 실행 및 확장되는 코드 덩어리입니다. 즉, 매크로를 사용하려면 컴파일 중에 해당 모듈과 구현을 사용할 수 있어야합니다. 이것은 require
지시문 으로 수행됩니다 .
일반적으로 해당 모듈에서 사용 가능한 매크로를 사용하려는 경우를 제외하고는 사용 전에 모듈이 필요하지 않습니다.
우리는 import
정규화 된 이름을 사용하지 않고 다른 모듈에서 함수 나 매크로에 쉽게 액세스 할 때마다 사용합니다. 예를 들어, 모듈 에서 duplicate/2
함수를 List
여러 번 사용하려면 가져올 수 있습니다.
iex> import List, only: [duplicate: 2]
List
iex> duplicate :ok, 3
[:ok, :ok, :ok]
이 경우, 함수 duplicate
(arity 2 포함) 만List
.
참고이 import
자동으로 모듈을 보내고require
으로이야.
지시어 use
는 아니지만 require
현재 컨텍스트에서 모듈을 사용할 수 있도록 밀접하게 관련된 매크로 입니다. 그만큼use
매크로는 개발자가 외부 기능을 현재 어휘 범위, 모듈로 가져 오는 데 자주 사용됩니다.
뒤에서 use
주어진 모듈이 필요 하다가 그 모듈에서 __using__/1
콜백 을 호출 하여 모듈이 현재 컨텍스트에 코드를 삽입 할 수 있습니다. 일반적으로 다음 모듈은 다음과 같습니다.
defmodule Example do
use Feature, option: :value
end
에 컴파일
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
Python / Java / Golang 언어의 배경으로 import
vs use
도 혼란 스러웠습니다. 이것은 선언적 언어 예제와 함께 코드 재사용 메커니즘을 설명합니다.
즉, Elixir에서는 모듈을 가져올 필요가 없습니다. 모든 공용 함수는 정규화 된 MODULE.FUNCTION 구문으로 액세스 할 수 있습니다.
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
Python / Java / Golang import MODULE
에서 해당 모듈에서 함수 (예 : Python)를 사용 하려면 먼저
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
그렇다면 import
엘릭서에서 당신을 놀라게 할 것입니다 :
정규화 된 이름을 사용하지 않고 다른 모듈에서 함수 또는 매크로에 쉽게 액세스 할 때마다 가져 오기를 사용합니다.
https://elixir-lang.org/getting-started/alias-require-and-import.html#import
그래서 당신은 입력 할 경우, sqrt
대신 Integer.sqrt
, trim
대신 String.trim
, import
의지의 도움을
iex()> import Integer
Integer
iex()> sqrt(100)
10.0
iex()> import String
String
iex()> trim(" Hello Elixir ")
"Hello Elixir"
이로 인해 코드 읽기 및 이름 충돌시 문제가 발생할 수 있으므로 Erlang (Elixir에 영향을주는 언어 ) 에서는 권장되지 않습니다 . 그러나 Elixir에는 그러한 규칙이 없으므로 자신의 위험에 따라 사용할 수 있습니다.
파이썬에서도 다음과 같은 효과가 있습니다.
from math import *
짧고 빠른 타이핑을 위해 일부 특수 시나리오 / 대화식 모드 에서만 사용하는 것이 좋습니다 .
무엇을 만드는가 use
/require
개념 파이썬 / 자바 / Golang ... 가족에 존재하지 않는 - 다른 것은 그들이 "매크로"관련이 있다는 것입니다.
당신은 할 필요가 없습니다 import
그 기능을 사용하는 모듈,하지만 당신은 필요 require
의 매크로를 사용하는 모듈 :
iex()> Integer.mod(5, 3) # mod is a function
2
iex()> Integer.is_even(42)
** (CompileError) iex:3: you must require Integer before invoking the macro Integer.is_even/1
(elixir) src/elixir_dispatch.erl:97: :elixir_dispatch.dispatch_require/6
iex()> require Integer
Integer
iex()> Integer.is_even(42) # is_even is a macro
true
하지만 is_even
보통의 함수로 기록 될 수 있습니다, 그것은 매크로 때문입니다 :
Elixir에서 Integer.is_odd / 1은 매크로로 정의되어 가드로 사용될 수 있습니다.
https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, Elixir 문서에서 발췌 :
사용하려면 주어진 모듈이 필요하고 그 모듈에서
__using__/1
콜백 을 호출 하여 모듈이 현재 컨텍스트에 코드를 삽입 할 수 있습니다.
defmodule Example do
use Feature, option: :value
end
에 컴파일
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
글쓰기 use X
는 글쓰기 와 같습니다
require X
X.__using__()
use/2
매크로입니다 . 매크로는 코드를 다른 코드로 변환합니다.
당신은 당신이 원할 use MODULE
때 :
require
)MODULE.__using__()
Elixir 1.5에서 테스트
주어진 모듈의 모든 함수와 매크로가 호출되는 어휘 범위 내에서 액세스 할 수 있도록합니다. 대부분의 경우 가져 오기 위해 하나 이상의 기능 / 매크로 만 있으면됩니다.
예:
defmodule TextPrinter do
import IO, only: [puts: 1]
def execute(text) do
puts(text)
end
end
iex> TextPrinter.execute("Hello")
Hello
:ok
이 매크로는 주입 할 수 있는 현재 모듈의 코드를. use
장면 뒤에서 정확히 어떤 일이 발생하는지 확실하지 않을 수 있으므로 외부 라이브러리를 사용할 때는주의해야합니다 .
예:
defmodule Printer do
defmacro __using__(_opts) do
quote do
def execute(text) do
IO.puts(text)
end
end
end
end
defmodule TextPrinter do
use Printer
end
iex> TextPrinter.execute("Hello")
Hello
:ok
내부 장면 코드 뒤에 모듈 __using__
에 주입되었습니다 TextPrinter
.
import Module
모듈 내에서 사용할 기능을 제공합니다.use Module
사용할 함수를 가져오고 모듈에 공개합니다.