字面量就是值。值最终必须编码成二进制存储在某块内存上。
变量与字面量的关系就像杯子和水的关系。
字面量是有类型的。字面量类型有:布尔、数字、文本、字节
一、布尔
类型是bool
true
false
二、数字
通过后缀表示类型
通过前缀表示进制
通过 "_" 来分割数据,易于可读性
(一)整数
长度 | 有符号类型 | 无符号类型 |
---|---|---|
8位 | i8 | u8 |
16位 | i16 | u16 |
32位 | i32 | u32 |
64位 | i64 | u64 |
128位 | i128 | u128 |
视架构而定 | isize | usize |
isize 和 usize 类型取决于程序运行的计算机CPU类型: 若CPU是32位的,则这两个类型是32位的,同理,若CPU是64位,那么它们则是64位。
进制形式 | 示例 |
---|---|
十进制 | 98 |
十六进制 | 0xff |
八进制 | 0o77 |
二进制 | 0b1111_0000 |
例如
7
7u8
0b111
0x7u8
(二)小数
f32
f64
例如
0.1
0.1f64;
0.1e7;
12E-9f64;
三、文本
(一)单字符
类型是char
使用''
两个单引号之间可以是unicode字符和转义字符。
所有转义字符
名称 | |
---|---|
\x41 | 7-bit字符编码(2位数字,最大值为0x7F) |
\u{7FFF} | 24-bit Unicode字符编码(最多6个数字) |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
\\ |
反斜线 |
\' |
单引号 |
\" |
双引号 |
\0 | Null |
例子
'a'
'中'
'\u{4567}'
'\x62'
'\"'
(二)字符串
字符串字面量类型是&str。这也就是为什么字符串字面值是不可变的;&str 是一个不可变引用。
1.双引号括起来就是一个字符串
当在换行符前面使用 \时,则\、换行符、下一行开头的所有空格都将会被忽略:
let a = "foobar";
let b = "foo\
bar";
assert_eq!(a,b);
2.原生字符串字面量
不做任何转义,表示原样字符串
(1)使用r""
例如,
r"\x52"等价于"\\x52",值为\x52
"foo"; r"foo"; // foo
"\x52"; "R"; r"R"; // R
"\\x52"; r"\x52"; // \x52
(2)使用 r#""#的方式来指定字符串边界
如果字符串中有双引号怎么办?因为原生字符串里不能使用转义,所以 \"
是肯定不行的。
在双引号两侧加#,比如,
r#""foo""#等价于"\"foo\"",值为"foo"
如果字符串中有#怎么办?那就增加边界#的数量,开头结尾需要相等数量的 #。
比如字符串里面有4个 #,那么该字符串可以用r#####"abc####def"#####
来包围起来,也就是比里面的 # 多即可。
示例:
"\"foo\""; r#""foo""#; // "foo"
"foo #\"# bar";
r##"foo #"# bar"##; // foo #"# bar
四、字节
(一)字节
字节类型其实就是u8,就是整数。
使用b''形式
两个单引号之间可以是非转义ascii字符和字节转义
字节转义
名称 | |
---|---|
\x7F | 8-bit字符编码(2位数字,最大值为255) |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
\\ |
反斜线 |
\0 | Null |
\' |
' |
\" |
" |
例子
b'7'
b'\x55'
b'\n'
b'\''
b'\\'
(二)字节串
字节串字面量类型为&[u8]。
1.使用 b""
比如
b"world"
b"\x52\x75\x73\x74 as bytes"
2.原生字节串字面量
不做任何转义
(1)使用br""
b"foo"; br"foo"; // foo
b"\x52"; b"R"; br"R"; // R
b"\\x52"; br"\x52"; // \x52
(2)使用br#""#
示例:
b"\"foo\""; br#""foo""#; // "foo"
b"foo #\"# bar";
br##"foo #"# bar"##; // foo #"# bar