Với nền tảng từ các ngôn ngữ Python / Java / Golang, import
vs use
cũng bị nhầm lẫn với tôi. Điều này sẽ giải thích cơ chế tái sử dụng mã với một số ví dụ về ngôn ngữ khai báo.
nhập khẩu
Nói tóm lại, trong Elixir, bạn không cần nhập mô-đun. Tất cả các chức năng công cộng có thể được truy cập bằng cú pháp MODULE.FUNCTION đủ điều kiện:
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
Trong Python / Java / Golang, bạn cần import MODULE
trước khi có thể sử dụng các hàm trong MODULE đó, ví dụ: Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
Sau đó, những gì import
trong Elixir có thể làm bạn ngạc nhiên:
Chúng tôi sử dụng nhập bất cứ khi nào chúng tôi muốn dễ dàng truy cập các chức năng hoặc macro từ các mô-đun khác mà không cần sử dụng tên đủ điều kiện
https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Vì vậy, nếu bạn muốn gõ sqrt
thay vì Integer.sqrt
, trim
thay vì String.trim
, import
sẽ giúp
iex()> import Integer
Integer
iex()> sqrt(100)
10.0
iex()> import String
String
iex()> trim(" Hello Elixir ")
"Hello Elixir"
Điều này có thể gây ra sự cố khi đọc mã và khi có xung đột tên nên không được khuyến nghị trong Erlang (ngôn ngữ có ảnh hưởng đến Elixir). Nhưng không có quy ước như vậy trong Elixir, bạn có thể tự chịu rủi ro khi sử dụng nó.
Trong Python, hiệu ứng tương tự có thể được thực hiện bằng cách:
from math import *
và nó chỉ được khuyến nghị sử dụng trong một số tình huống đặc biệt / chế độ tương tác - để gõ ngắn hơn / nhanh hơn.
sử dụng và yêu cầu
Điều gì làm cho use
/require
khác biệt là chúng liên quan đến "macro" - khái niệm không tồn tại trong gia đình Python / Java / Golang ....
Bạn không cần import
một mô-đun để sử dụng các chức năng của nó, nhưng bạn cần require
một mô-đun để sử dụng các macro của nó :
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
Mặc dù is_even
có thể được viết như một hàm bình thường, nó là một macro vì:
Trong Elixir, Integer.is_odd / 1 được định nghĩa là macro để có thể sử dụng nó làm bảo vệ.
https://elixir-lang.org/getting-started/alias-require-and-import.html#require
use
, để trích từ tài liệu Elixir:
sử dụng yêu cầu mô-đun đã cho và sau đó gọi __using__/1
lại cuộc gọi trên nó cho phép mô-đun đưa một số mã vào ngữ cảnh hiện tại.
defmodule Example do
use Feature, option: :value
end
được biên dịch thành
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Vì vậy, viết use X
cũng giống như viết
require X
X.__using__()
use/2
là một macro , macro sẽ chuyển đổi mã thành mã khác cho bạn.
Bạn sẽ muốn use MODULE
khi bạn:
- muốn truy cập các macro của nó (
require
)
- VÀ thực hiện
MODULE.__using__()
Đã thử nghiệm trên Elixir 1.5
import Module
mang lại các chức năng được sử dụng trong mô-đun của bạn.use Module
mang lại các chức năng được sử dụng VÀ hiển thị chúng công khai trên mô-đun của bạn