@@ -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