Elixir - Bí danh

Để tạo điều kiện cho việc sử dụng lại phần mềm, Elixir cung cấp ba chỉ thị: alias, requireimport. Nó cũng cung cấp một macro được gọi là sử dụng được tóm tắt bên dưới:

# Alias the module so it can be called as Bar instead of Foo.Bar
alias Foo.Bar, as: Bar

# 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

Bây giờ chúng ta hãy hiểu chi tiết về từng chỉ thị.

bí danh

Chỉ thị bí danh cho phép bạn thiết lập bí danh cho bất kỳ tên mô-đun nhất định nào. Ví dụ: nếu bạn muốn đặt một bí danh'Str' vào mô-đun Chuỗi, bạn có thể chỉ cần viết -

alias String, as: Str
IO.puts(Str.length("Hello"))

Chương trình trên tạo ra kết quả sau:

5

Một bí danh được cấp cho String mô-đun như Str. Bây giờ khi chúng ta gọi bất kỳ hàm nào bằng cách sử dụng ký tự Str, nó thực sự tham chiếu đếnStringmô-đun. Điều này rất hữu ích khi chúng tôi sử dụng tên mô-đun rất dài và muốn thay thế những tên mô-đun bằng tên ngắn hơn trong phạm vi hiện tại.

NOTE - Bí danh MUST bắt đầu bằng một chữ cái viết hoa.

Bí danh chỉ có giá trị trong lexical scope chúng được gọi vào. Ví dụ: nếu bạn có 2 mô-đun trong một tệp và tạo bí danh trong một trong các mô-đun, bí danh đó sẽ không thể truy cập được trong mô-đun thứ hai.

Nếu bạn đặt tên của một mô-đun được xây dựng sẵn, như String hoặc Tuple, làm bí danh cho một số mô-đun khác, để truy cập vào mô-đun dựng sẵn, bạn sẽ cần phải thêm nó với "Elixir.". Ví dụ,

alias List, as: String
#Now when we use String we are actually using List.
#To use the string module: 
IO.puts(Elixir.String.length("Hello"))

Khi chương trình trên được chạy, nó tạo ra kết quả sau:

5

yêu cầu

Elixir cung cấp macro như một cơ chế để lập trình meta (viết mã tạo ra mã).

Macro là các đoạn mã được thực thi và mở rộng tại thời điểm biên dịch. Điều này có nghĩa là, để sử dụng macro, chúng ta cần đảm bảo rằng mô-đun và việc triển khai của nó có sẵn trong quá trình biên dịch. Điều này được thực hiện vớirequire chỉ thị.

Integer.is_odd(3)

Khi chương trình trên được chạy, nó sẽ tạo ra kết quả sau:

** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1

Trong Elixir, Integer.is_odd được định nghĩa là một macro. Macro này có thể được sử dụng như một người bảo vệ. Điều này có nghĩa là, để gọiInteger.is_odd, chúng ta sẽ cần mô-đun Integer.

Sử dụng require Integer và chạy chương trình như hình dưới đây.

require Integer
Integer.is_odd(3)

Lúc này chương trình sẽ chạy và tạo ra kết quả là: true.

Nói chung, không cần có mô-đun trước khi sử dụng, ngoại trừ trường hợp chúng ta muốn sử dụng các macro có sẵn trong mô-đun đó. Cố gắng gọi một macro không được tải sẽ gây ra lỗi. Lưu ý rằng giống như chỉ thị bí danh, request cũng có phạm vi từ vựng . Chúng ta sẽ nói nhiều hơn về macro trong chương sau.

nhập khẩu

Chúng tôi sử dụng importchỉ thị để 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. Ví dụ: nếu chúng ta muốn sử dụngduplicate từ mô-đun Danh sách nhiều lần, chúng ta có thể nhập nó một cách đơn giản.

import List, only: [duplicate: 2]

Trong trường hợp này, chúng tôi chỉ nhập hàm trùng lặp (với độ dài danh sách đối số là 2) từ Danh sách. Mặc du:only là tùy chọn, nên sử dụng nó để tránh nhập tất cả các chức năng của một mô-đun nhất định bên trong không gian tên. :except cũng có thể được cung cấp như một tùy chọn để nhập mọi thứ trong một mô-đun ngoại trừ danh sách các chức năng.

Các import chỉ thị cũng hỗ trợ :macros:functions được trao cho :only. Ví dụ: để nhập tất cả các macro, người dùng có thể viết:

import Integer, only: :macros

Lưu ý rằng nhập khẩu quá Lexically scopedgiống như chỉ thị yêu cầu và bí danh. Cũng lưu ý rằng'import'ing a module also 'require's it.

sử dụng

Mặc dù không phải là một chỉ thị, use là một macro có liên quan chặt chẽ đến requirecho phép bạn sử dụng một mô-đun trong ngữ cảnh hiện tại. Macro sử dụng thường được các nhà phát triển sử dụng để đưa chức năng bên ngoài vào phạm vi từ vựng hiện tại, thường là các mô-đun. Hãy để chúng tôi hiểu chỉ thị sử dụng thông qua một ví dụ -

defmodule Example do 
   use Feature, option: :value 
end

Sử dụng là một macro chuyển đổi ở trên thành -

defmodule Example do
   require Feature
   Feature.__using__(option: :value)
end

Các use Module trước tiên yêu cầu mô-đun và sau đó gọi __using__macro trên Mô-đun. Elixir có khả năng lập trình siêu ứng tuyệt vời và nó có các macro để tạo mã tại thời điểm biên dịch. Macro _ _using__ được gọi trong trường hợp trên và mã được đưa vào ngữ cảnh cục bộ của chúng ta. Bối cảnh cục bộ là nơi sử dụng macro được gọi vào thời điểm biên dịch.