一开始不知道这是用来干嘛的,看了半天我现在是这么理解的:
Rust中默认是不使用null值的,不像Java,定义一个String对象,可以不初始化,那么就是null。Rust中有了let但不初始化,那么编译是不能通过。
但是某些情况下需要表示“无”的概念。学生没有参加考试,那么考试成绩不是0,而是null,因为没参加考试,是不能讲分数计入平均分的。Rust中为了表示这个“无”,才专门去使用“无”的概念,即null的值在我的应用里是有意义的,那么我才会来用null值。
一般的编程语言,都是默认是“无”,只有需要填充值的时候,才去赋值。这个做法很自然,但是会存在很多运行时错误的弊端。
但是回头想一下类型系统的来源,类型其实是对现实生活的抽象,只有存在的事物,或状态是“有”的事物,人才会去进行抽象。那么定义时强制要求赋值,也是很自然的。同时这也引申出编码的一个规则出来,不能再在代码文件头定义一堆未使用变量,有些还没有初始化,只有变量在将被用到的时候,才会被定义、赋值和使用,这对阅读代码的使用者有时也是有好处的,对只是看代码清单,并不修改、调试、开发的人则没有意义。
那么怎么用呢?Rust的解决方案是用Option<T>包装一下。包装后,这么考试的分数就是Option<Score>了,这是一个枚举,有两个成员变量,Some(score)表示不为null的情况,None表示“无”的情况。
但要注意Some(score)的类型是Option<T>,而不是Score,使用时需要按需转换。
具体细节可以参考链接。
https://blog.youkuaiyun.com/lizhe_dashuju/article/details/108152027