变量
- 变量默认是不可变的
- 不能使用没有初始化的变量
作用域
变量离开作用域之后会直接释放, 无法再次使用; 在内部代码块中定义的变量会导致外部的变量被遮蔽
类型转换
部分类型可以隐式转换, 部分类型需要使用 as
手动显式转换
let num_u32 = 100u32;let num_i64 = num_u32 as i64;
From和Into
实现对应的接口可以方便进行类型转换.
From和Into的函数接口是自动推断和相互转换的, 所以, 只需要实现From接口的from函数即可
struct Number {value: i32,
}impl From<i32> for Number {fn from(value: i32) -> Self {Number { value }}
}fn main() {let number: Number = 42.into();println!("The number is {}", number.value);
}
TryFrom和TryInto
当进行类型转换的时候, 可能出现类型不能转换的情况, 这个时候会抛出异常, 异常需要被处理, 所以, 应该使用 Result
作为返回值被接受
impl TryFrom<i32> for EvenNumber {type Error = ();fn try_from(value: i32) -> Result<Self, Self::Error> {if value % 2 == 0 {Ok(EvenNumber(value))} else {Err(())}}
}
to_string和from_string
实现了 Display 的接口之后的默认也是实现了 to_string
的方法
变量传递
使用 &
传递变量的引用
类型推断
根据变量如何使用和变量初始化时候的赋值自动推断
表达式计算变量
可以在 {}
中编写表达式, 计算出来的结果会被赋值给变量
fn main() {let x = 5u32;let y = {let x_squared = x * x;let x_cube = x_squared * x;// 将此表达式赋给 `y`x_cube + x_squared + x};let z = {// 分号结束了这个表达式,于是将 `()` 赋给 `z`2 * x;};println!("x is {:?}", x);println!("y is {:?}", y);println!("z is {:?}", z);
}
这里的最后一个语句是一个表达式, 而不是完整的代码语句, 并且不能携带
;
, 不然会被赋值为()