当前位置: 代码迷 >> 综合 >> 学习心得:rust 就是 c 语言的升华版
  详细解决方案

学习心得:rust 就是 c 语言的升华版

热度:62   发布时间:2023-12-12 15:47:51.0

本文讨论比较了rust、c、c++ 函数参数传递语法特点,分析了 rust 语法机制的合理性和简洁性。

1. rust 就是 c 语言

1.1 函数调用传参:传值

看代码,这段程序与 c 语言机制完全相同。

fn foo(x: i32) {
    }fn main() {
    let x = 123;foo(x);
}

我们再看看复合数据类型:

struct T {
    a: i32,b: i32,
}fn foo(x: T) {
    }fn main(){
    let x = T{
    a:1, b: 2};foo(x);
}

这个调用方法与 c 语言完全一样,参数采用传值方式。

1.2 函数调用传参:传地址

上述代码改成传递变量地址的方式,虽然函数声明与 c 语言稍有区别,但运行机制完全一样。

struct T {
    }fn foo(x: &T) {
    }fn main(){
    let x = T{
    };foo(&x);
}

1.3 c++ 语法,更透明,还是更混沌?

下表给出了三种传参方式的 rust、c、c++ 声明方式。

传参方式 rust 声明 c 声明 c++ 声明
传值 fn foo(x: T) void foo(T x) void foo(T x)
只读引用 fn foo(x: &T) - void foo(const T *x), void foo(const T &x)
读写引用 fn foo(x: &mut T) void foo(T *x) void foo(T *x), void foo(T &x)

下表给出了三种传参方式的 rust、c、c++ 调用方式。

传参方式 rust 调用 c 调用 c++ 调用
传值 foo(x) foo(x) foo(x)
只读引用 foo(&x) - foo(x), foo(&x)
读写引用 foo(&mut x) foo(&x) foo(x), foo(&x)

可以看出,

  • c 语言表达能力不足,不能提供只读引用,rust 弥补了其不足。
  • c++ 的调用形式无法表达传参类型,表达混乱。
  • rust 的函数声明和调用形式完全一一对应,语法、语义简单明了。

2. rust OOP:就是 c 语言 struct

在选择"爱情"还是“上床”来表达自己的想法时,c++ 选择了前者,而 rust 非常诚实地选择了后者。

下面代码,实现了类 T 的方法,本质上是 c 语言的实现方式,没有采用 c++ 的虚表。 rust 的没有浪费内存资源和时间资源,可取的和 c 语言同样的编程效率。当然,rust 提供了类似 c++ 风格的语法糖,所以下面程序展示了两种方法的调用形式,本质还是 c 语言模式的。

作为三十多年经验的 c++ 老油条,我都不敢说自己对 c++ 的 class 有多全面了解。但是,对于 rust 程序员来讲,你明白 struct 是咋回事,你就懂的一切了!

struct T {
    }impl T {
    fn do_something(&self) {
    }
}fn main(){
    let x = T{
    };//c 风格的调用,T 就是一个 struct,没啥神奇的!T::do_something(&x);//c++ 风格调用,看起来像个 class,其实还是 struct,忘掉构造、析构、封装、继承、多态、...x.do_something();
}

3. 泛型编程,实现 c 语言到 rust 的升华

真正能让 rust 能超越 oop 的是泛型机制和类型系统。此处不多讲了,以后专门讨论。

原创不易,如有帮助,请点赞、关注、收藏,谢谢支持!