变量和可变属性
变量定义
代码语言:javascript复制let x = 5;
用
let
关键字定义变量,rust这一点和python、js很像,是弱数据类型的,通过赋值来推测变量类型。
需要注意的是,这样直接定义的变量,不能再次赋值,比如:
代码语言:javascript复制let x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
就会直接报错,会提示不能第二次给不可变的变量赋值(cannot assign twice to immutable variable)。 除非写成这样:
代码语言:javascript复制let mut x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
这样倒是没问题,因为mut关键字指定了x是可变的。Rust里面,默认居然是不可变的,变量还要主动指定mut,才是可变的!WTF!
常量
下面是常量的定义方式:
代码语言:javascript复制const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
关键字const定义常量,常量必须指定数据类型,比如u32,很奇怪的是,前面介绍的
let x = 5
,同样是赋值一次后不可变,本身也有常量的意思了,这里还提供了const关键字作为常量定义,让我有点感觉多余。虽然根据官方的解释,这两者有区别:
- 不能使用mut关键字来指const常量可变;
- 可定义的范围(scope)不同,const可以在任何位置定义,甚至是全局环境;
- 可以给一个const常量赋值一个常量表达式(如上面的例子)
阴影
这个概念不好理解,其实就是定义和前面同名的变量,那么后面的会覆盖住前面的变量。看个例子就明白了:
代码语言:javascript复制fn main() {
let x = 5;
let x = x 1;
{
let x = x * 2;
println!("The value of x in the inner scope is: {}", x);
}
println!("The value of x is: {}", x);
}
执行结果:
代码语言:javascript复制$ cargo run
Compiling variables v0.1.0 (file:///projects/variables)
Finished dev [unoptimized debuginfo] target(s) in 0.31s
Running `target/debug/variables`
The value of x in the inner scope is: 12
The value of x is: 6
数据类型
Rust语言规定每一个值都要有明确的数据类型,虽然在变量定义时,是弱数据类型的(不需要在定义变量时说明变量的数据类型),但是变量的数据类型必须可以被推测,如果在赋值时不能被推测,那么就强制要求定义时必须要指定类型。比如下面这个例子:
代码语言:javascript复制let guess: u32 = "42".parse().expect("Not a number!");
如果没有指定guess为u32类型,就会出现:
代码语言:javascript复制$ cargo build
Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations)
error[E0282]: type annotations needed
--> src/main.rs:2:9
|
2 | let guess = "42".parse().expect("Not a number!");
| ^^^^^ consider giving `guess` a type
For more information about this error, try `rustc --explain E0282`.
error: could not compile `no_type_annotations` due to previous error
显然是parse方法无法进行类型转换的推测,所以报错了。必须要给guess一个明确的类型,parse方法才知道要转成什么类型。
简单标量类型
Rust内置4种标量类型——整型,浮点型,布尔型,字符型。
整型
类型有6种:
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 |
整型的字面表达(literal)是这样的:
字面类型 | 例子 |
---|---|
十进制 | 98_222 |
十六进制 | 0xff |
八进制 | 0o77 |
二进制 | 0b1111_0000 |
字节 (u8) | b’A’ |
浮点类型
Rust的两个浮点类型是f32和f64,默认一个浮点数是f64的:
代码语言:javascript复制fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
布尔类型
很简单,就是bool
,值就是true
和false
,在内存中,只占一个字节:
fn main() {
let t = true;
let f: bool = false; // with explicit type annotation
}
字符类型
和java完全一样,用单引号表示一个unicode字符,在内存中占4个字节:
代码语言:javascript复制fn main() {
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '