Elixir - 符號



在本章中,我們將探索符號,即語言提供用於處理文字表示的機制。符號以波浪號 (~) 字元開頭,後跟一個字母(識別符號號),然後是一個分隔符;可以選擇在最終分隔符之後新增修飾符。

正則表示式

Elixir 中的正則表示式是符號。我們在字串章節中已經看到過它們的用法。讓我們再舉一個例子,看看如何在 Elixir 中使用正則表示式。

# A regular expression that matches strings which contain "foo" or
# "bar":
regex = ~r/foo|bar/
IO.puts("foo" =~ regex)
IO.puts("baz" =~ regex)

執行上述程式時,會產生以下結果:

true
false

符號支援 8 種不同的分隔符:

~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r<hello>

支援不同分隔符的原因是,不同的分隔符可能更適合不同的符號。例如,對正則表示式使用括號可能是一個令人困惑的選擇,因為它們可能與正則表示式內部的括號混淆。但是,括號對於其他符號可能非常方便,我們將在下一節中看到。

Elixir 支援與 Perl 相容的正則表示式,也支援修飾符。您可以閱讀有關正則表示式用法的更多資訊 這裡

字串、字元列表和單詞列表

除了正則表示式之外,Elixir 還有 3 個內建符號。讓我們看看這些符號。

字串

~s 符號用於生成字串,就像雙引號一樣。例如,當字元串同時包含雙引號和單引號時,~s 符號很有用:

new_string = ~s(this is a string with "double" quotes, not 'single' ones)
IO.puts(new_string)

此符號生成字串。執行上述程式時,會產生以下結果:

"this is a string with \"double\" quotes, not 'single' ones"

字元列表

~c 符號用於生成字元列表:

new_char_list = ~c(this is a char list containing 'single quotes')
IO.puts(new_char_list)

執行上述程式時,會產生以下結果:

this is a char list containing 'single quotes'

單詞列表

~w 符號用於生成單詞列表(單詞只是普通的字串)。在 ~w 符號內,單詞由空格分隔。

new_word_list = ~w(foo bar bat)
IO.puts(new_word_list)

執行上述程式時,會產生以下結果:

foobarbat

~w 符號還接受c、sa 修飾符(分別用於字元列表、字串和原子),它們指定結果列表中元素的資料型別:

new_atom_list = ~w(foo bar bat)a
IO.puts(new_atom_list)

執行上述程式時,會產生以下結果:

[:foo, :bar, :bat]

符號中的插值和轉義

除了小寫符號外,Elixir 還支援大寫符號來處理跳脫字元和插值。雖然 ~s 和 ~S 都會返回字串,但前者允許轉義程式碼和插值,而後者則不允許。讓我們考慮一個例子來理解這一點:

~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}"

自定義符號

我們可以輕鬆建立自己的自定義符號。在本例中,我們將建立一個符號將字串轉換為大寫。

defmodule CustomSigil do
   def sigil_u(string, []), do: String.upcase(string)
end

import CustomSigil

IO.puts(~u/tutorials point/)

當我們執行上述程式碼時,會產生以下結果:

TUTORIALS POINT

首先,我們定義一個名為 CustomSigil 的模組,並在該模組中,我們建立了一個名為 sigil_u 的函式。由於現有符號空間中不存在 ~u 符號,因此我們將使用它。_u 表示我們希望使用 u 作為波浪號後面的字元。函式定義必須接受兩個引數,一個輸入和一個列表。

廣告