RUST 0x01 数据类型
1 变量与可变性
先上两段代码和一段错误信息:
fn main() {
let x = 5;
println!("The value of x is: {}",x);
x = 6;
println!("The value of x is: {}",x);
}
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:4:5
|
2 | let x = 5;
| - first assignment to `x`
3 | println!("The value of x is: {}", x);
4 | x = 6;
| ^^^^^ cannot assign twice to immutable variable
fn main() {
let mut x = 5;
println!("The value of x is: {}",x);
x = 6;
println!("The value of x is: {}",x);
}
let是函数式语言中的绑定(binding),而不是赋值(assignment)
let
→使前者绑定后者,且前者不能再被改变mut
→可变的(mutable)let mut
→使前者绑定后者,但前者可以改变
变量与常量间的区别
使用
const
定义常量的时候 必须 将常量的数据类型注明。常量可以在任何区域声明,包括全局。
- 常量只能被定义为一个常表达式,而不能是一个函数的返回值或者其他只能在运行中被计算出来的值。
常量的命名规范:大写字母、数字、下划线。为了提高可读性,可以在定义的数字之中加入下划线,如:
const MAX_POINTS: u32 = 100_000;
这种情况下,MAX_POINTS
的值就是100000
。
Shadowing
shadow一个变量:利用相同的变量名并再次使用let
,如:
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
println!("The value of x is: {}", x);
}
> cargo run
Compiling variables v0.1.0 (file:///projects/variables)
Finished dev [unoptimized + debuginfo] target(s) in 0.31 secs
Running `target/debug/variables`
The value of x is: 12
shadowing与用mut
标记变量不同,因为我们如果不使用let
,就会CE(Compile-time Error)。
我们可以利用shadow对一个不可变的变量进行一些变换。在shadow之后,该变量仍然是不可变的。
shadow与mut
的另一个不同之处在于:当我们再次使用let
时,我们相当于是有效地创建了一个新的变量,我们可以在使用相同的变量名的同时改变变量的数据类型,比如:
let spaces = " ";
let spaces = spaces.len();
而如果使用的是mut
,就会跳出CE:
error[E0308]: mismatched types
--> src/main.rs:3:14
|
3 | spaces = spaces.len();
| ^^^^^^^^^^^^ expected &str, found usize
|
= note: expected type `&str`
found type `usize`
2 数据类型
Rust是静态类型语言。所以编写代码时应该注意标记数据类型。
数字类型
Rust有四种基本数字类型:整数,浮点数,逻辑量和字符。
整数类型
长度(Length) | 带符号(Signed) | 无符号(Unsigned) |
---|---|---|
8-bit | i8 |
u8 |
16-bit | i16 |
u16 |
32-bit | i32 |
u32 |
64-bit | i64 |
u64 |
128-bit | i128 |
u128 |
arch | isize |
usize |
每个变量都具有具体的大小(size),而且要么带符号,要么无符号。
带符号变量可存储的数字大小:
\[
[-(2^{n-1}),2^{n-1}-1],n=二进制位数(bits)
\]
无符号变量可存储的数字大小:
\[
[0,2^n-1],n=二进制位数(bits)
\]
比如i8
就是[-128, 127]。
此外,isize
和usize
类型的二进制位数是由运行的计算机决定的。如果是在64位计算机上运行就是64位,如果是在32位计算机上运行就是32位。
在Rust中,可以在代码中用如下方式表示要表达的数字。
数字表示方法(Number literals) | 示例 |
---|---|
十进制(Decimal) | 98_222 |
十六进制(Hex) | 0xff |
八进制(Octal) | 0o77 |
二进制(Binary) | 0b1111_0000 |
字节(Byte) (u8 only) |
b'A' |
而且除了字节,所有数字表示方法都允许加入标注类型的后缀比如57u8
以及分隔符_
比如1_000
。
整数类型默认为i32
,因为i32
无论在64位系统还是32位系统都是运行得最快的。
浮点类型
Rust有两种基本浮点类型:f32
、f64
浮点类型默认为f64
,因为现代的CPU运算f64
的速度和f32
几乎一样快,但却有更高的精度。
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
f32
是单精度浮点数,f64
是双精度浮点数。
数字运算
Rust提供基本数字运算:加、减、乘、除、取余。
fn main() {
let sum = 5 + 10; //加
let difference = 95.5 - 4.3; //减
let product = 4 * 30; //乘
let quotient = 56.7 / 32.2; //除
let remainder = 43 % 5; //模
}
逻辑类型
bool
。大小只有一个字节。
两种值:true
和false
。
fn main() {
let t = true;
let f: bool = false; // 有具体的类型标示
}
字符类型
char
。用单引号''
。
fn main() {
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '