本文讨论比较了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 的是泛型机制和类型系统。此处不多讲了,以后专门讨论。
原创不易,如有帮助,请点赞、关注、收藏,谢谢支持!