Rust 是 C++ 的继承者

刚看完《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等, 强大的编译期检测。


rust