zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

rust语言 就是 学习心得
2023-09-27 14:20:16 时间

本文讨论比较了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 的是泛型机制和类型系统。此处不多讲了,以后专门讨论。

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