Sigil love là gì

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:

  • iex> re = ~r/elixir/
    ~r/elixir/
    
    iex> "Elixir" =~ re
    false
    
    iex> "elixir" =~ re
    true
    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]

Chuỗi phân tách bao gồm:

  • iex> re = ~r/elixir/
    ~r/elixir/
    
    iex> "Elixir" =~ re
    false
    
    iex> "elixir" =~ re
    true
    8 Một cặp dấu ngoặc nhọn
  • iex> re = ~r/elixir/
    ~r/elixir/
    
    iex> "Elixir" =~ re
    false
    
    iex> "elixir" =~ re
    true
    9 Một cặp dấu ngoặc xoắn
  • iex> re = ~r/elixir/i
    ~r/elixir/i
    
    iex> "Elixir" =~ re
    true
    
    iex> "elixir" =~ re
    true
    0 Một cặp dấu ngoặc vuông
  • iex> 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òn
  • iex> re = ~r/elixir/i
    ~r/elixir/i
    
    iex> "Elixir" =~ re
    true
    
    iex> "elixir" =~ re
    true
    2 Một cặp dấu đường ống
  • iex> 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éo
  • iex> 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ép
  • iex> 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 đơn

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.

Chủ Đề