Elixir - Dấu hiệu
Trong chương này, chúng ta sẽ khám phá các dấu hiệu, các cơ chế được cung cấp bởi ngôn ngữ để làm việc với các biểu diễn dạng văn bản. Các dấu hiệu bắt đầu bằng ký tự dấu ngã (~), theo sau là một chữ cái (xác định dấu hiệu) và sau đó là dấu phân cách; tùy chọn, các bổ ngữ có thể được thêm vào sau dấu phân cách cuối cùng.
Regex
Regexes trong Elixir là dấu hiệu. Chúng ta đã thấy việc sử dụng chúng trong chương Chuỗi. Chúng ta hãy lấy một ví dụ một lần nữa để xem chúng ta có thể sử dụng regex trong Elixir như thế nào.
# A regular expression that matches strings which contain "foo" or
# "bar":
regex = ~r/foo|bar/
IO.puts("foo" =~ regex)
IO.puts("baz" =~ regex)
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
true
false
Các dấu hiệu hỗ trợ 8 dấu phân cách khác nhau -
~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r<hello>
Lý do đằng sau việc hỗ trợ các dấu phân cách khác nhau là các dấu phân cách khác nhau có thể phù hợp hơn cho các dấu hiệu khác nhau. Ví dụ: sử dụng dấu ngoặc đơn cho biểu thức chính quy có thể là một lựa chọn khó hiểu vì chúng có thể bị lẫn với dấu ngoặc đơn bên trong regex. Tuy nhiên, dấu ngoặc đơn có thể hữu ích cho các dấu hiệu khác, như chúng ta sẽ thấy trong phần tiếp theo.
Elixir hỗ trợ các regex tương thích Perl và cũng hỗ trợ các công cụ sửa đổi. Bạn có thể đọc thêm về việc sử dụng regexes tại đây .
Chuỗi, danh sách Char và danh sách Word
Ngoài regexes, Elixir có thêm 3 dấu hiệu sẵn có. Hãy để chúng tôi xem xét các dấu hiệu.
Dây
Dấu hiệu ~ s được sử dụng để tạo chuỗi, giống như dấu ngoặc kép. Dấu hiệu ~ s rất hữu ích, ví dụ, khi một chuỗi chứa cả dấu ngoặc kép và dấu nháy đơn -
new_string = ~s(this is a string with "double" quotes, not 'single' ones)
IO.puts(new_string)
Dấu hiệu này tạo ra các chuỗi. Khi chương trình trên được chạy, nó tạo ra kết quả sau:
"this is a string with \"double\" quotes, not 'single' ones"
Danh sách Char
Dấu hiệu ~ c được sử dụng để tạo danh sách char -
new_char_list = ~c(this is a char list containing 'single quotes')
IO.puts(new_char_list)
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
this is a char list containing 'single quotes'
Danh sách các từ
Dấu hiệu ~ w được sử dụng để tạo danh sách các từ (các từ chỉ là các chuỗi thông thường). Bên trong dấu hiệu ~ w, các từ được phân tách bằng khoảng trắng.
new_word_list = ~w(foo bar bat)
IO.puts(new_word_list)
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
foobarbat
Dấu hiệu ~ w cũng chấp nhận c, s và a bổ ngữ (cho danh sách char, chuỗi và nguyên tử, tương ứng), chỉ định kiểu dữ liệu của các phần tử của danh sách kết quả -
new_atom_list = ~w(foo bar bat)a
IO.puts(new_atom_list)
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
[:foo, :bar, :bat]
Nội suy và thoát khỏi dấu hiệu
Bên cạnh ký hiệu viết thường, Elixir hỗ trợ ký hiệu viết hoa để xử lý các ký tự thoát và nội suy. Trong khi cả ~ s và ~ S sẽ trả về chuỗi, chuỗi thứ nhất cho phép mã thoát và nội suy trong khi chuỗi thứ hai thì không. Chúng ta hãy xem xét một ví dụ để hiểu điều này -
~s(String with escape codes \x26 #{"inter" <> "polation"})
# "String with escape codes & interpolation"
~S(String without escape codes \x26 without #{interpolation})
# "String without escape codes \\x26 without \#{interpolation}"
Dấu hiệu tùy chỉnh
Chúng tôi có thể dễ dàng tạo các dấu hiệu tùy chỉnh của riêng mình. Trong ví dụ này, chúng ta sẽ tạo một dấu hiệu để chuyển một chuỗi thành chữ hoa.
defmodule CustomSigil do
def sigil_u(string, []), do: String.upcase(string)
end
import CustomSigil
IO.puts(~u/tutorials point/)
Khi chúng tôi chạy đoạn mã trên, nó tạo ra kết quả sau:
TUTORIALS POINT
Đầu tiên, chúng tôi xác định một mô-đun được gọi là CustomSigil và trong mô-đun đó, chúng tôi đã tạo một hàm có tên sigil_u. Vì không có dấu hiệu ~ u hiện có trong không gian dấu hiệu hiện có, chúng tôi sẽ sử dụng nó. _U chỉ ra rằng chúng ta muốn sử dụng u làm ký tự sau dấu ngã. Định nghĩa hàm phải có hai đối số, một đầu vào và một danh sách.