面向C++程序员的Rust教程(一)

前言

一直以来笔者都在从事以C++为主要开发语言的工作,但事实上在实际的工作中,并不可能一门语言就cover住所有的需求。一来,对于像前端、CGI、脚本、数据库相关等工作任务,本来就着其专用的工具和语言,作为后端开发程序员都是必须涉猎的,也就是所谓「全栈」;二来,C++虽然全能,但它也逐渐老了,在一些更为专用的领域会显得臃肿,因此越来越多新兴语言也开始百花齐放。

作为软件、互联网行业的一员,我们也必须时刻跟上时代的脚步,在加上一些大佬的安利,笔者决定开始研究Rust,并且着重研究这门语言的世界观、倾向性以及它与C++的异同。

本系列文章作为笔者的学习笔记和研究产出,主要面向下列读者群体:

  1. 已经有足够的C++知识积累或开发经验
  2. 希望转型到Rust,或是希望以Rust作为第二技能的,又或是单纯兴趣性地学习和研究Rust的
  3. 并不满足于表面涉猎,希望能深入理解和领悟的

作为一门程序语言,能够找到的入门级教程可以说数不胜数,但笔者认为,针对Rust来说,从C++转入Rust的教程比单纯的Rust入门教程更加有意义,理由如下:

  1. 很少有人会把Rust作为第一入门语言的,或者说,假如这个人没有接触过编程,那么他大概率是不会把Rust作为第一门学习编程的语言的(反倒是C语言、js或者Swift作为第一门语言的概率要大得多)。
  2. 从Rust的很多设计理念上来说,他针对于C++容易出现的各种问题做了非常多的优化,所以对于那些「饱受C++摧残」的程序员来说,更加适合来学习一下Rust,从中可以获得很多不一样的思路。
  3. Rust相对来说会更加偏底层一些,比如说嵌入式、各种系统内核、各种中间件、各种通用工具等,这些领域正好完美命中了C和C++之间的尴尬地带,或者说用C语言不太够但用C++又门槛太高且风险较大,Rust提供了一个比较好的解决方案,非常适合那些不满足于纯C,但又忍受不了C++的这部分人或团队。

因此,针对于本身是C++程序员,又希望涉足Rust的这部分人群来说,更加需要的是一个专有的教程,而非通用的Rust入门教程。

综上所述,笔者以《面向C++程序员的Rust教程》进行开题,作为本身就是C++程序员兼Rust学习者的身份,相信能给读者带来切身体会和不一样的理解感悟。

从Hello World说起

按照世界级惯例,程序语言教程都由一个Hello World开始。一来我们可以以最少的篇幅来编写一段可运行的程序,让我们建立对这门语言的主观印象;二来也可以从这个最简单的程序里看到很多端倪,这有助于我们接下来的学习和研究。

fn main() {
   
   
  println!("Hello, World!");
}

算上大括号也就只有短短的3行,但其实能看出不少东西的,我们一一来说。

首先,整体上来说,Rust也采用了大括号和分号的代码风格,这一点跟C++一样,而不同于Python和Go。函数体是用大括号包裹的,并且每行语句都以分号结尾,那么这种风格通常来说都是对缩进和空格、空行不敏感的,因此这里的缩进、空行等都是一种让代码可读性更高的编码规范,而不是语法本身要求。

其次,这里出现了我们熟悉的main函数,作为程序的入口。函数是可以直接单独存在的,不需要强行包裹在类中,这一点与Java不同,说明Rust至少是「可以」做面向过程编程的。

最后,我们可以看到main函数是空参数空返回值的,这一点与C/C++不同,也就是说当Rust程序作为应用程序时,其与OS或父进程之间的交流应当有其他专有的方式,而不是通过传参。这种限制其实有他自己的独特优势的,这点我们在后面章节再详细介绍。

其他呈现的细节还有比如说双引号表示字符串,而单引号表示字符,这与C++表现一致,不同于js、Python、shell等。这些都等后面章节我们再一一诉说。

这里希望读者可以有一个主观印象,Rust程序大致就是长这个样子哒~。

类型说明符

在C语言以及其衍生语言(如C++、Java、Objective-C等)中,有一个非常大的特点(甚至说是缺陷),就是「行为」被隐含在了「类型」说明符之中。

举个例子来说:

int a;

这里的int首先是表达了「创建变量」的含义,其次才是表示「变量类型是整型」。「创建变量」这种表示动作的语义是隐藏在里面的,根据类型说明符的位置、上下文、组合等不同来区分。比如上面单独一个类型符号表示创建变量,而如果加上小括号就表示「函数声明」的动作:

int f();

这里的int()共同表示「函数声明」,而int又承担了「函数返回值类型」的类型说明的含义。

而在一些「仅需要表示动作,不需要类型」的场合,C++的这种语法就显得很奇怪和诡异,比如说:

template <typename T1, typename T2>
auto f(T1 a, T2 b) -> decltype(a + b) {
   
   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

borehole打洞哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值