为什么要有option

  1. String str = null;

在其他语言中值是可是使用null作为值的,在使用的时候进行填充。

为什么Rust没有null

当我们使用null作表达时:

  • 需要在后续进行填充,如果没有填充可能会对程序造成影响。
  • 在某些地方需要进行非空判断,会消耗开发人员的心力。
  • 如果某些地方未进行非空判断,对程序是来说是具有很大的安全隐患,即使做了也不一定完全可靠。
  • 也影响了一定的代码可读性
  • …还有其他问题

Rust中默认是不能使用null的值,就为了避免一些null引起的问题。

Rust的option

但是某些情况需要表示无的这个概念,例如学生没有参加考试,那么成绩不应该是0,而应该是null,因为没有参加考试,是不能计入平均分的。

但是Rust默认值不能为null,Rust使用了option来解决这个问题。

2.option的使用

option源码

  1. pub enum Option<T> { //T是任意类型的意思 泛型
  2. /// No value.
  3. #[lang = "None"]
  4. #[stable(feature = "rust1", since = "1.0.0")]
  5. None,
  6. /// Some value of type `T`.
  7. #[lang = "Some"]
  8. #[stable(feature = "rust1", since = "1.0.0")]
  9. Some(#[stable(feature = "rust1", since = "1.0.0")] T), // Some(包含一个泛型)
  10. }

option是一个枚举 他有两个枚举值 Some ,None

建立一个None的值

  1. //必须要声明类型
  2. let none: Option<i32> = None; //因为是泛型原因 Rust不能自动推断 必须要声明类型
  3. let _equivalent_none = None::<i32>;

option使用场景

例如学生没有参加考试,那么成绩不应该是0,而应该是null,因为没有参加考试,是不能计入平均分的。

  1. fn main() {
  2. let xiaoming: Option<i32> = None;
  3. let xiaohong = Some(66);
  4. read_option(xiaohong);
  5. read_option(xiaoming);
  6. }
  7. fn read_option(x: Option<i32>) {
  8. match x {
  9. None => println!("缺考"),
  10. Some(i) => println!("考了{}分", i),
  11. }
  12. }