Elixir cung cấp cho chúng ta một cú pháp thay thế để mô tả và làm việc với chuỗi kí tự. Một sigil sẽ bắt đầu với dấu ngã ~
theo sau bởi một kí tự. Elixir cung cấp cho chúng ta một số sigils ban đầu, tuy nhiên chúng ta có thể tự tạo thêm các sigils khi cần thiết để mở rộng ngôn ngữ.
Chuỗi sigils được cung cấp ban đầu bao gồm:
0 Sinh ra một chuỗi các kí tự không gồm kí tự escape và kí tự nội suy [interpolation]iex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
1 Sinh ra một chuỗi các kí tự gồm kí tự escape và kí tự nội suy [interpolation]iex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
2 Sinh ra một chuỗi biểu thức chính qui không gồm kí tự escape và kí tự nội suy [interpolation]iex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
3 Sinh ra một chuỗi biểu thức chính qui gồm kí tự escape và kí tự nội suy [interpolation]iex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
4 Sinh ra một string không gồm kí tự escape và kí tự nội suy [interpolation]iex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
5 Sinh ra một string gồm kí tự escape và kí tự nội suy [interpolation]iex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
6 Sinh ra một list không gồm kí tự escape và kí tự nội suy [interpolation]iex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
7 Sinh ra một list gồm kí tự escape và kí tự nội suy [interpolation]iex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
Chuỗi phân tách bao gồm:
8 Một cặp dấu ngoặc nhọniex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
9 Một cặp dấu ngoặc xoắniex> re = ~r/elixir/ ~r/elixir/ iex> "Elixir" =~ re false iex> "elixir" =~ re true
0 Một cặp dấu ngoặc vuôngiex> re = ~r/elixir/i ~r/elixir/i iex> "Elixir" =~ re true iex> "elixir" =~ re true
1 Một cặp dấu ngoặc tròniex> re = ~r/elixir/i ~r/elixir/i iex> "Elixir" =~ re true iex> "elixir" =~ re true
2 Một cặp dấu đường ốngiex> re = ~r/elixir/i ~r/elixir/i iex> "Elixir" =~ re true iex> "elixir" =~ re true
3 Một cặp dấu gạch chéoiex> re = ~r/elixir/i ~r/elixir/i iex> "Elixir" =~ re true iex> "elixir" =~ re true
4 Một cặp dấu trích dẫn képiex> re = ~r/elixir/i ~r/elixir/i iex> "Elixir" =~ re true iex> "elixir" =~ re true
5 Một cặp dấu trích dẫn đơniex> re = ~r/elixir/i ~r/elixir/i iex> "Elixir" =~ re true iex> "elixir" =~ re true
Kí tự
iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
1 và iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
0 sigils sinh ra chuỗi kí tự tương ứng. Ví dụ:iex> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'
iex> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'
Chúng ta có thể thấy kí tự thường
iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
1 sẽ nội suy phần tính toán, trong khi kĩ tự hoa iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
0 không. Chúng ta sẽ thấy chuỗi kí tự hoa / thường sẽ là chủ đề thường thấy của các sigils có sẵn.iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
3 và iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
2 sigils thường được sử dụng để biểu diễn biểu thức chính qui. Biểu thức chính qui đó được tạo ra ngay lúc chạy hoặc là để sử dụng bên trong hàm iex> string = "100_000_000"
"100_000_000"
iex> Regex.split[~r/_/, string]
["100", "000", "000"]
2. Ví dụ:iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
Chúng ta có thể thấy trong ví dụ đầu tiên kiểm tra về mặt đẳng thức,
iex> string = "100_000_000"
"100_000_000"
iex> Regex.split[~r/_/, string]
["100", "000", "000"]
3 không khớp với biểu thức chính qui, bởi vì nó được viết hoa. Do Elixir hỗ trợ biểu thức chính qui theo chuẩn Perl [ Perl Compatible Regular Expressions [PCRE]], chúng ta có thể thêm iex> string = "100_000_000"
"100_000_000"
iex> Regex.split[~r/_/, string]
["100", "000", "000"]
4 vào cuối của sigils để bật chế độ kiểm tra không phụ thuộc vào viết hoa.iex> re = ~r/elixir/i
~r/elixir/i
iex> "Elixir" =~ re
true
iex> "elixir" =~ re
true
Hơn nữa, Elixir cung cấp Regex API được xây dựng trên nền của thư viện biểu thức chính qui của Erlang. Hãy thử thực hành hàm
iex> string = "100_000_000"
"100_000_000"
iex> Regex.split[~r/_/, string]
["100", "000", "000"]
5 sử dụng regex sigil nào:iex> string = "100_000_000"
"100_000_000"
iex> Regex.split[~r/_/, string]
["100", "000", "000"]
Như chúng ta có thể thấy, chuỗi
iex> string = "100_000_000"
"100_000_000"
iex> Regex.split[~r/_/, string]
["100", "000", "000"]
6 được chia tại dấu gạch dưới nhờ có sự giúp đỡ của iex> string = "100_000_000"
"100_000_000"
iex> Regex.split[~r/_/, string]
["100", "000", "000"]
7 sigil. Hàm iex> string = "100_000_000"
"100_000_000"
iex> Regex.split[~r/_/, string]
["100", "000", "000"]
8 trả lại một chuỗi.iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
5 và iex> re = ~r/elixir/
~r/elixir/
iex> "Elixir" =~ re
false
iex> "elixir" =~ re
true
4 sigils được sử dụng để sinh dữ liệu chuỗi. Ví dụ:iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"
iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"
Vậy hai biểu diễn khác gì nhau? Điểm khác nhau tương tự như sigil cho chuỗi các kí tự mà chúng ta đã xem ở trên. Câu trả lời nằm ở việc nội suy và sử dụng chuỗi escape. Hãy xem một ví dụ khác:
iex> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"
iex> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir \#{String.downcase \"SCHOOL\"}"
Chuỗi từ sigil rất tiện dụng trong nhiều hoàn cảnh. Nhờ nó chúng ta có thể tiết kiệm thời gian, số lượng phím bấm và thậm chí có thể giảm được sự phức tạp bên trong dự án. Hãy xem ví dụ đơn giản dưới đây:
iex> ~w/i love elixir school/
["i", "love", "elixir", "school"]
iex> ~W/i love elixir school/
["i", "love", "elixir", "school"]
Chúng ta có thể thấy những thứ được phân tách bởi dấu cách sẽ thành một phần tử trong chuỗi. Tuy nhiên, không có nhiều khác biệt giữa hai ví dụ. Một lần nữa, sự khác biệt lại chính là việc nội suy và chuỗi kí tự escape. Hãy xem ví dụ dưới đây:
iex> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]
iex> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]
Một trong những mục tiêu của Elixir là trở thành một ngôn ngữ có thể mở rộng được. Do đó mà không hề ngạc nhiên khi chúng ta có thể tự tạo mới sigils. Trong ví dụ dưới đây, chúng ta sẽ tạo mới sigil để chuyển một chuỗi sang dạng viết hoa. Do chúng ta đã có sẵn hàm để làm việc đó trong Elixir [
iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"
iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"
1], chúng ta sẽ bọc hàm đó lại bởi sigil.
iex> defmodule MySigils do
...> def sigil_u[string, []], do: String.upcase[string]
...> end
iex> import MySigils
nil
iex> ~u/elixir school/
ELIXIR SCHOOL
Đầu tiên chúng ta định nghĩa một module tên là
iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"
iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"
2 và bên trong module đó, chúng ta tạo một hàm tên là iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"
iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"
3. Do chưa có iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"
iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"
4 nào có sẵn trong không gian sigil, chúng ta sẽ có thể sử dụng được kí tự đó. Phần iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"
iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"
5 nói lên rằng chúng ta muốn sử dụng kí tự iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"
iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"
6 sau dấu ngã của sigil. Định nghĩa của hàm sẽ phải nhận vào 2 biến, một input và một chuỗi.