Strings( Strings)
Elixir中的字符串插入双引号之间,它们以UTF-8编码。 与C和C ++不同,默认字符串是ASCII编码的,只有256个不同的字符,UTF-8由66536 code points 。 这意味着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
字符串插值
字符串插值是一种通过在字符串文字中包含它们的值,从常量,变量,文字和表达式的混合构造新的String值的方法。 Elixir支持字符串插值,在字符串中使用变量,在编写字符串时,用花括号括起来,并在花括号前加上“#”符号。
例如,
x = "Apocalypse"
y = "X-men #{x}"
IO.puts(y)
这将取x的值并将其替换为y。 上面的代码将生成以下结果 -
X-men Apocalypse
字符串连接
我们已经在前面的章节中看到过使用String连接。 '<>'运算符用于连接Elixir中的字符串。 要连接2个字符串,
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
字符串比较
要比较2个字符串,我们可以使用==或===运算符。 例如,
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
字符串函数 (String Functions)
Elixir支持大量与字符串相关的函数,下面列出了一些最常用的函数。
Sr.No. | 功能及其目的 |
---|---|
1 | at(string, position) 返回给定utf8字符串位置的字形。 如果position大于字符串长度,则返回nil |
2 | capitalize(string) 将给定字符串中的第一个字符转换为大写,将余数转换为小写 |
3 | contains?(string, contents) 检查字符串是否包含任何给定内容 |
4 | downcase(string) 将给定字符串中的所有字符转换为小写 |
5 | ends_with?(string, suffixes) 如果string以给定的任何后缀结束,则返回true |
6 | first(string) 从utf8字符串返回第一个字形,如果字符串为空则返回nil |
7 | last(string) 返回utf8字符串中的最后一个字形,如果字符串为空则返回nil |
8 | replace(subject, pattern, replacement, options \\ []) 返回通过替换主题中的pattern的出现而创建的新字符串 |
9 | slice(string, start, len) 返回从偏移量start开始的子字符串,长度为len |
10 | split(string) 在每个Unicode空白事件中将字符串分为子字符串,忽略前导和尾随空格。 空白组被视为单个事件。 在不破坏的空白处不会出现划分 |
11 | upcase(string) 将给定字符串中的所有字符转换为大写 |
Binaries
二进制只是一个字节序列。 二进制文件使用《《 》》定义。 例如:
<< 0, 1, 2, 3 >>
当然,这些字节可以以任何方式组织,即使在不使它们成为有效字符串的序列中也是如此。 例如,
<< 239, 191, 191 >>
字符串也是二进制文件。 字符串连接运算符《》实际上是二进制连接运算符:
IO.puts(<< 0, 1 >> <> << 2, 3 >>)
上面的代码生成以下结果 -
<< 0, 1, 2, 3 >>
注意ł字符。 由于这是utf-8编码,因此该字符表示占用2个字节。
由于二进制中表示的每个数字都是一个字节,当此值从255上升时,它将被截断。 为了防止这种情况,我们使用size修饰符来指定我们想要该数字的位数。 例如 -
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位倍数的变量才是二进制文件。
Bitstrings
如果我们使用size修饰符定义二进制文件并将其传递给不是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整除。模式匹配以相同的方式处理二进制和位串。