理解 Rust 的 None 和 Some(T)

Rust 语言没有 NULL, None, null, nil 这些表示“无”的值,那么 Rust 怎么表示和处理“无”呢? 在比较对象的时候,需要先校验两个对象的是否存在。例如下面的 Python 语句 def inorder(p, q): if p is None and q is None: return true if p is None or q is None: return False if not inorder(p.left, q.left): return False if p.val != q.val: return False if not inorder(p.right, q.right): return False 这是一段用于检查两棵二叉树是否一致的算法,为了能够顺利执行后面三行代码,必须要先检查p 和 q 是否为“无”。 Rust 给了另一个稍微不同的思考切入点。 Rust 的答卷 在 Rust 中,有一种枚举类叫做Option<T>。它的定义如下 enum Option<T> { Some(T), None, } 熟悉泛型的同学不用我多做介绍 T 是什么了。不熟悉的同学, T 是 Template 的缩写,可以被替换成 任何类型。Option<T> 有两个成员,Some(T) 和 None。Some(T) 表示“有值”,None 表示“无值”。 通过后面的阐述,你会更加清楚 T 的作用。...

December 3, 2022

Rust 里的所有权

十分遗憾,我从未认真学习过一门底层语言。这两年底层的语言最火的,要数 Rust 了。据说 Linux 官方也认可这门语言,希望可以利用这门语言代替一些 C 语言的模块。我早认为自己需要认真学习一门底层语言。顺着 Rust 的大火,我翻看了 The Rust Programming Language。其中第四章的 所有权(ownership) 吸引了我。 在 Rust 中,每个值都有一个所有者 Rust 认为所有值(values) 都有且只有一个所有者。 let s = String::from("hello"); 上面的语句中 “hello” 这个 String 归 s所有。 所有权可以出借 有且仅有一个所有者的情况下,把值赋给另一个变量会导致变量的转移(moved),这被称为所有权的借出(borrow) 。 fn main() { let s = String::from("hello"); // 所有权借给了 `_s` let _s = s; println!("{:?}", s); } 执行这段代码会报错,原因是我们试图打印 s,但 s的值此刻被 _s 借走了。想要再次使用 s 也简单,let s = _s 还回来就好了。 这和很多语言的拷贝(copy)不同。传统上,编程语言提供两种拷贝方式 浅拷贝(shallow copy) 深拷贝(deep copy) 以上面的代码为例 在深拷贝的情况下,_s 的创建会完整的复制s的内容,对_s 的操作和更改不会影响s。...

November 27, 2022