刚看完《Rust Programming Language》开头章节“A brief introduction to Rust”,第一个例子就可以看出它是 C++ 的继承者,相信每个 C++ 开发者会忍不住会心一笑。
看以下代码
fn main() { let mut x = vec!["Hello", "world"]; let y = &x[0]; x.push("foo"); }
会编译出错
error: cannot borrow `x` as mutable because it is also borrowed as immutable x.push("foo"); ^ note: previous borrow of `x` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `x` until the borrow ends let y = &x[0]; ^ note: previous borrow ends here fn main() { } ^
可以这样修复
fn main() { let mut x = vec!["Hello", "world"]; let y = x[0].clone(); x.push("foo"); }
也可以这样修复
fn main() { let mut x = vec!["Hello", "world"]; { let y = &x[0]; } x.push("foo"); }
再多新颖的关键字也掩不住骨子里的 C++ 气息:作用域、引用,还有代码未明确表达的 “move语义”、RAII等。
考虑到 Rust 宣称是一门“安全”、“高效”、“并发”的语言,消除了大量 C++ 的缺陷,对于一个掌握 C++ 的开发人员来说,语法形式上添加的繁琐不是问题,只要是经得起推敲那就是合理的。
Rust 是由 Servo (浏览器引擎)项目驱动的,这导致现阶段 Rust 的定位是客户端系统软件开发,服务端高并发相关的需求被延后(如:异步I/O、协程),从这一点上看 Rust、Golang 其实是互补的。
Rust 的主要特性:
基本类型
与 C++ 相似
模板
与 C++ 相似,更友好的错误信息
Trait
Rust 语言级的支持,没有继承,通过 Trait 实现了运行时多态
- RAII
- 静态类型及自动类型推导
- 模块化支持
- 文档及测试
宏
Rust 的宏更安全,不同于 C++ 的基于文本的替换,Rust 的宏是语义完备的。
安全优先
Rust 设计上的主要考虑就是安全(Safety),如变量定义默认是 const 的,borrow checker,lifetime等, 强大的编译期检测。