Elixir - 字串



Elixir 中的字串用雙引號括起來,並且使用 UTF-8 編碼。與 C 和 C++ 中預設使用 ASCII 編碼且僅支援 256 個不同字元不同,UTF-8 包含 1,112,064 個碼位。這意味著 UTF-8 編碼包含這麼多不同的可能字元。由於字串使用 utf-8,我們也可以使用諸如 ö、ł 等符號。

建立字串

要建立字串變數,只需將字串賦值給變數即可:

str = "Hello world"

要將其列印到控制檯,只需呼叫 **IO.puts** 函式並將其傳遞變數 str 即可:

str = str = "Hello world" 
IO.puts(str)

上述程式生成以下結果:

Hello World

空字串

可以使用字串字面量 **""** 建立空字串。例如,

a = ""
if String.length(a) === 0 do
   IO.puts("a is an empty string")
end

上述程式生成以下結果。

a is an empty string

字串插值

字串插值是一種透過將常量、變數、字面量和表示式的值包含在字串字面量中來構建新的字串值的方法。Elixir 支援字串插值,在編寫字串時使用變數,將其用花括號括起來並在花括號前加上 **'#'** 符號。

例如,

x = "Apocalypse" 
y = "X-men #{x}"
IO.puts(y)

這將獲取 x 的值並將其替換到 y 中。上述程式碼將生成以下結果:

X-men Apocalypse

字串連線

我們已經在前面的章節中看到了字串連線的使用。**'<>'** 運算子用於在 Elixir 中連線字串。要連線兩個字串,

x = "Dark"
y = "Knight"
z = x <> " " <> y
IO.puts(z)

上述程式碼生成以下結果:

Dark Knight

字串長度

要獲取字串的長度,我們使用 **String.length** 函式。將字串作為引數傳遞,它將顯示其大小。例如,

IO.puts(String.length("Hello"))

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

5

反轉字串

要反轉字串,將其傳遞給 String.reverse 函式。例如,

IO.puts(String.reverse("Elixir"))

上述程式生成以下結果:

rixilE

字串比較

要比較兩個字串,可以使用 == 或 === 運算子。例如,

var_1 = "Hello world"
var_2 = "Hello Elixir"
if var_1 === var_2 do
   IO.puts("#{var_1} and #{var_2} are the same")
else
   IO.puts("#{var_1} and #{var_2} are not the same")
end

上述程式生成以下結果:

Hello world and Hello elixir are not the same.

字串匹配

我們已經看到了 =~ 字串匹配運算子的使用。要檢查字串是否與正則表示式匹配,我們還可以使用字串匹配運算子或 String.match? 函式。例如,

IO.puts(String.match?("foo", ~r/foo/))
IO.puts(String.match?("bar", ~r/foo/))

上述程式生成以下結果:

true 
false

這也可以透過使用 =~ 運算子來實現。例如,

IO.puts("foo" =~ ~r/foo/)

上述程式生成以下結果:

true

字串函式

Elixir 支援大量與字串相關的函式,以下表格列出了一些最常用的函式。

序號 函式及其用途
1

at(string, position)

返回給定 utf8 字串中 position 位置的字元。如果 position 大於字串長度,則返回 nil

2

capitalize(string)

將給定字串中的第一個字元轉換為大寫,其餘字元轉換為小寫

3

contains?(string, contents)

檢查字串是否包含任何給定的內容

4

downcase(string)

將給定字串中的所有字元轉換為小寫

5

ends_with?(string, suffixes)

如果字串以任何給定的字尾結尾,則返回 true

6

first(string)

返回 utf8 字串中的第一個字元,如果字串為空則返回 nil

7

last(string)

返回 utf8 字串中的最後一個字元,如果字串為空則返回 nil

8

replace(subject, pattern, replacement, options \\ [])

返回一個新字串,該字串透過用 replacement 替換 subject 中 pattern 的出現次數來建立

9

slice(string, start, len)

返回從偏移量 start 開始,長度為 len 的子字串

10

split(string)

將字串在每個 Unicode 空格處分割成子字串,忽略前導和尾隨空格。空格組被視為單個出現。分割不會發生在不間斷空格上

11

upcase(string)

將給定字串中的所有字元轉換為大寫

二進位制

二進位制只是一系列位元組。二進位制使用 **<< >>** 定義。例如

<< 0, 1, 2, 3 >>

當然,這些位元組可以以任何方式組織,甚至以不使它們成為有效字串的序列組織。例如,

<< 239, 191, 191 >>

字串也是二進位制。並且字串連線運算子 **<>** 實際上是一個二進位制連線運算子

IO.puts(<< 0, 1 >> <> << 2, 3 >>)

上述程式碼生成以下結果:

<< 0, 1, 2, 3 >>

注意 ł 字元。由於它是 utf-8 編碼,因此此字元表示佔用 2 個位元組。

由於二進位制中表示的每個數字都表示一個位元組,因此當此值從 255 上升時,它會被截斷。為了防止這種情況,我們使用大小修飾符來指定我們希望該數字佔用多少位。例如:

IO.puts(<< 256 >>) # truncated, it'll print << 0 >>
IO.puts(<< 256 :: size(16) >>) #Takes 16 bits/2 bytes, will print << 1, 0 >>

上述程式將生成以下結果:

<< 0 >>
<< 1, 0 >>

如果字元是碼位,我們也可以使用 utf8 修飾符,則它將在輸出中產生;否則為位元組:

IO.puts(<< 256 :: utf8 >>)

上述程式生成以下結果:

Ā

我們還有一個名為 **is_binary** 的函式,它檢查給定變數是否為二進位制。請注意,只有儲存為 8 位倍數的變數才是二進位制。

位元串

如果我們使用大小修飾符定義二進位制並向其傳遞不是 8 的倍數的值,則最終會得到位元串而不是二進位制。例如,

bs = << 1 :: size(1) >>
IO.puts(bs)
IO.puts(is_binary(bs))
IO.puts(is_bitstring(bs))

上述程式生成以下結果:

<< 1::size(1) >>
false
true

這意味著變數 **bs** 不是二進位制而是位元串。我們也可以說二進位制是位元串,其中位元數可以被 8 整除。模式匹配以相同的方式作用於二進位制和位元串。

廣告