
- Elixir 教程
- Elixir - 首頁
- Elixir - 概述
- Elixir - 環境
- Elixir - 基本語法
- Elixir - 資料型別
- Elixir - 變數
- Elixir - 運算子
- Elixir - 模式匹配
- Elixir - 決策
- Elixir - 字串
- Elixir - 字元列表
- Elixir - 列表和元組
- Elixir - 關鍵字列表
- Elixir - 對映
- Elixir - 模組
- Elixir - 別名
- Elixir - 函式
- Elixir - 遞迴
- Elixir - 迴圈
- Elixir - 可列舉
- Elixir - 流
- Elixir - 結構體
- Elixir - 協議
- Elixir - 檔案 I/O
- Elixir - 程序
- Elixir - 符號
- Elixir - 推導式
- Elixir - 型別規範
- Elixir - 行為
- Elixir - 錯誤處理
- Elixir - 宏
- Elixir - 庫
- Elixir 有用資源
- Elixir - 快速指南
- Elixir - 有用資源
- Elixir - 討論
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 整除。模式匹配以相同的方式作用於二進位制和位元串。