为什么要有option
String str = null;
在其他语言中值是可是使用null作为值的,在使用的时候进行填充。
为什么Rust没有null
当我们使用null作表达时:
- 需要在后续进行填充,如果没有填充可能会对程序造成影响。
- 在某些地方需要进行非空判断,会消耗开发人员的心力。
- 如果某些地方未进行非空判断,对程序是来说是具有很大的安全隐患,即使做了也不一定完全可靠。
- 也影响了一定的代码可读性
- …还有其他问题
Rust中默认是不能使用null的值,就为了避免一些null引起的问题。
Rust的option
但是某些情况需要表示无的这个概念,例如学生没有参加考试,那么成绩不应该是0,而应该是null,因为没有参加考试,是不能计入平均分的。
但是Rust默认值不能为null,Rust使用了option来解决这个问题。
2.option的使用
option源码
pub enum Option<T> { //T是任意类型的意思 泛型
/// No value.
#[lang = "None"]
#[stable(feature = "rust1", since = "1.0.0")]
None,
/// Some value of type `T`.
#[lang = "Some"]
#[stable(feature = "rust1", since = "1.0.0")]
Some(#[stable(feature = "rust1", since = "1.0.0")] T), // Some(包含一个泛型)
}
option是一个枚举 他有两个枚举值 Some ,None
建立一个None的值
//必须要声明类型
let none: Option<i32> = None; //因为是泛型原因 Rust不能自动推断 必须要声明类型
let _equivalent_none = None::<i32>;
option使用场景
例如学生没有参加考试,那么成绩不应该是0,而应该是null,因为没有参加考试,是不能计入平均分的。
fn main() {
let xiaoming: Option<i32> = None;
let xiaohong = Some(66);
read_option(xiaohong);
read_option(xiaoming);
}
fn read_option(x: Option<i32>) {
match x {
None => println!("缺考"),
Some(i) => println!("考了{}分", i),
}
}