Skip to content

Commit 88d4d33

Browse files
author
Naupio Z.Y. Huang
committed
add 04-02-primitive-type (#202)
* add 04-02-primitive-type
1 parent 4cfea70 commit 88d4d33

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

04-quickstart-rewrite-WIP/04-02-primitive-type.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,86 @@ fn main() {
7171
}
7272
```
7373
这里使用了 bool,只有true和false两个值,通常用来做逻辑判断的类型。
74+
75+
## 原生类型
76+
77+
Rust内置的原生类型 (primitive types) 有以下几类:
78+
79+
* 布尔类型:有两个值`true``false`
80+
* 字符类型:表示单个Unicode字符,存储为4个字节。
81+
* 数值类型:分为有符号整数 (`i8`, `i16`, `i32`, `i64`, `isize`)、
82+
无符号整数 (`u8`, `u16`, `u32`, `u64`, `usize`) 以及浮点数 (`f32`, `f64`)。
83+
* 字符串类型:最底层的是不定长类型`str`,更常用的是字符串切片`&str`和堆分配字符串`String`
84+
其中字符串切片是静态分配的,有固定的大小,并且不可变,而堆分配字符串是可变的。
85+
* 数组:具有固定大小,并且元素都是同种类型,可表示为`[T; N]`
86+
* 切片:引用一个数组的部分数据并且不需要拷贝,可表示为`&[T]`
87+
* 元组:具有固定大小的有序列表,每个元素都有自己的类型,通过解构或者索引来获得每个元素的值。
88+
* 指针:最底层的是裸指针`*const T``*mut T`,但解引用它们是不安全的,必须放到`unsafe`块里。
89+
* 函数:具有函数类型的变量实质上是一个函数指针。
90+
* 元类型:即`()`,其唯一的值也是`()`
91+
92+
```rust
93+
// boolean type
94+
let t = true;
95+
let f: bool = false;
96+
97+
// char type
98+
let c = 'c';
99+
100+
// numeric types
101+
let x = 42;
102+
let y: u32 = 123_456;
103+
let z: f64 = 1.23e+2;
104+
let zero = z.abs_sub(123.4);
105+
let bin = 0b1111_0000;
106+
let oct = 0o7320_1546;
107+
let hex = 0xf23a_b049;
108+
109+
// string types
110+
let str = "Hello, world!";
111+
let mut string = str.to_string();
112+
113+
// arrays and slices
114+
let a = [0, 1, 2, 3, 4];
115+
let middle = &a[1..4];
116+
let mut ten_zeros: [i64; 10] = [0; 10];
117+
118+
// tuples
119+
let tuple: (i32, &str) = (50, "hello");
120+
let (fifty, _) = tuple;
121+
let hello = tuple.1;
122+
123+
// raw pointers
124+
let x = 5;
125+
let raw = &x as *const i32;
126+
let points_at = unsafe { *raw };
127+
128+
// functions
129+
fn foo(x: i32) -> i32 { x }
130+
let bar: fn(i32) -> i32 = foo;
131+
```
132+
133+
有几点是需要特别注意的:
134+
135+
* 数值类型可以使用`_`分隔符来增加可读性。
136+
* Rust还支持单字节字符`b'H'`以及单字节字符串`b"Hello"`,仅限制于ASCII字符。
137+
此外,还可以使用`r#"..."#`标记来表示原始字符串,不需要对特殊字符进行转义。
138+
* 使用`&`符号将`String`类型转换成`&str`类型很廉价,
139+
但是使用`to_string()`方法将`&str`转换到`String`类型涉及到分配内存,
140+
除非很有必要否则不要这么做。
141+
* 数组的长度是不可变的,动态的数组称为向量 (vector),可以使用宏`vec!`创建。
142+
* 元组可以使用`==``!=`运算符来判断是否相同。
143+
* 不多于32个元素的数组和不多于12个元素的元组在值传递时是自动复制的。
144+
* Rust不提供原生类型之间的隐式转换,只能使用`as`关键字显式转换。
145+
* 可以使用`type`关键字定义某个类型的别名,并且应该采用驼峰命名法。
146+
147+
```rust
148+
// explicit conversion
149+
let decimal = 65.4321_f32;
150+
let integer = decimal as u8;
151+
let character = integer as char;
152+
153+
// type aliases
154+
type NanoSecond = u64;
155+
type Point = (u8, u8);
156+
```

0 commit comments

Comments
 (0)