rust教程 第一章 —— 初识rust

news2024/11/24 0:22:12

文章目录

  • 前言
  • 一、Rust简介
  • 二、安装Rust编译器
  • 三、第一个Rust程序
  • 四、 IDE环境
  • 五、初识包管理
  • 六、总结


前言

本系列教程目录可查看这里:Rust教程目录

近些年来不断有新的语言崛起,比如当下非常火的go语言,不过相比于C++,go语言确实是非常简单的

所以我目前还没打算专门为go语言写一个专栏教程文章,仅仅是在我的C/C++实战入门到精通专栏花了一章对它进行介绍
在这里插入图片描述

rust作为一名新兴语言,却与go不同,因为它的目标是对标系统级开发,也就是试图动摇C、C++这两位纵横编程界数十年的老大哥位置。

比如我们最常用的windows系统,就是用C/C++语言开发,也正因如此,我们才能用C++在VS中可以非常方便的调用win API函数

而同样的,越是涉及到底层,需要控制的细节就会越多,即使是这位试图通过简便语法便利包管理安全可靠等良好特性脱颖而出的rust语言,也同样不例外。

在我稍稍学习了几天之后,就知道,这门语言的复杂程度我是完全可以写一系列专栏文章来介绍的。

注意:rust作为一门系统级开发语言,其学习难度并不比C、C++简单多少,但一旦你学会了,就可以快速、高效、安全的开发一系列程序,绝对比C、C++方便无数倍,所以你要想清楚自己是否需要学习这门语言

目前rust语言最大的缺点可能就是由于诞生不过十来年,目前生态还不够完善

比如如果想用rust写GUI程序,就很麻烦,因为官方目前还没有推出GUI库

但这并非是无法解决的,rust同样意识到了这个问题,所以提供了很多绑定C语言库的包,也就是说,只要能用C语言开发的,基本都可以用rust语言进行开发!

比如用rust绑定C开发的FLTK、GTK等GUI库就可以进行开发GUI程序了,当然也有正在发展的库,比如egui、iced等等

而rust带来的代码安全、便捷的开发又是C语言所无法比拟的,所以我预测要不了多少年,随着Rust生态的不断完善,会取代很大一部分C/C++的份额

除非windows、linux、mac三大操作系统以及各种开源库都采用rust语言重写,否则想要彻底取代C/C++还是有些不现实的,因为这些企业级的工程软件并非一朝一夕之功,不是说想要重写就能马上重写出来的,所以在相当长的一段时间内(二三十年?),C/C++程序语言在编程界应该仍然有着不可撼动的地位

因此便有了本文以及本专栏的文章,这是对标我的另一个C/C++实战入门到精通的教程文章。

力图写出即使是新人,也可以快速入门rust、上手开发简单软件、乃至写一些大型的有趣实战项目。

最好对C/C++语言有一定的了解,否则rust里面的很多概念你都可能无法理解

一、Rust简介

参考百度百科:

Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目。第一个有版本号的 Rust 编译器于2012 年 1 月发布。Rust 1.0 是第一个稳定版本,于 2015年5月15日发布。

可以看到,Rust是2015才对外开放稳定版本的,距今不过到10年,根据目前程序员对Rust这门语言的普遍评价来说,现在学习Rust,还有机会享受到这门语言在不久的将来可能会带来的福利

比如Rust的相关开发岗位可能会越来越多,而目前学习Rust的程序员数量,相比于C/C++来说,还是有些微不足道的,也就是说到时很可能就会出现供不应求的情况,供不应求带来的效益就是,Rust程序员的工资会逐年走高

那么具体来说,Rust能为开发人员带来哪些便利呢?

主要有以下几点:

  • 内存安全

Rust 中的所有内存访问都经过了编译器的严格检查,并且在运行时不会出现空指针异常或数据竞争等问题。这意味着 Rust代码具有更高的可靠性和安全性,可以避免常见的安全漏洞。

而C语言则时常需要担心指针、内存问题,尤其是大项目中,非常容易因此出现各种各样的Bug

  • 高效性能

Rust 具有与 C 和 C++ 相当的性能,并采用了现代语言的特性和设计理念,如智能指针、闭包和模式匹配等。这使得 Rust很适合编写高性能、低延迟的系统级应用程序和库。

  • 并发性

Rust 的所有权系统和借用规则使其易于编写线程安全的代码,即使在多线程环境下也可以保持高效率和可靠性。C/C++中则完全需要自己进行控制

  • 社区支持

Rust 拥有活跃的社区,提供了许多开源库、工具和框架,可以大幅度提升开发效率。C/C++虽然学习的人很多,但却几乎没有官方的、活跃的社区可以供大家交流,都是在各搞各的

  • 统一包管理

C/C++中,最让人诟病的便是包管理了,想要用一个包,还需要自己下载、安装、配置等等,而Rust则直接提供了一个统一的包管理程序,只需要写一行代码,就能自动为你下载配置好你所需要的一切,并且还提供对应的文档,使用起来非常方便!

综上,你便能看出Rust的优势所在了。

Python语言之所以能火,有很多原因,而其中很大的一个原因就是Python有一个统一的包管理程序pip,可以很方便的下载包。

而一旦学会了Rust,即使是作为较为底层的开发人员,我们同样也能享受到这种便利了!

这是学习C/C++所无法想象的(虽然目前有一个vcpkg包管理库很不错,但这毕竟不是标准委员会推出的,而是微软带头组织的一个开源项目,而且如果不会科学上网,中国几乎也无法使用)

二、安装Rust编译器

与C/C++一样,Rust也是一门编译型语言,也就是说,Rust的代码必须要先编译成为二进制程序之后才能运行

比如window系统中我们最常看到的 .exe二进制可执行程序

而python则是解释性语言,无需编译,只要有python的解释器,就能一行一行的解释代码然后执行,这同样也是影响python速度的一大原因

一般在浏览器中直接搜索Rust,出现的第一个就是Rust的官网了:

在这里插入图片描述
下面的各个标签:学习Rust、社区、安装、博客等等,都可以点进去看一看

我这里也放一下它的官网地址,可以直接点击查看:Rust官网

然后点击 马上开始
在这里插入图片描述

然后下载Rust的安装器(目前一般都是64位的电脑,所以选择第二个即可):

在这里插入图片描述
下载后,点击运行这个程序,等待其安装完毕即可

由于我原本就安装了VS2022,所以它并没有提示我安装任何东西,如果你没有安装VS,则可能要你安装上方提示的Microsoft C++生成工具,安装即可

安装完成后,运行命令:cargo --version
在这里插入图片描述

能打印出版本则说明安装成功了(win+R快捷键,输入cmd,按Enter键,即可进入控制台)

第一次使用你可能就会觉得有些疑惑,明明安装的是Rust,这里怎么是Cargo命令呢?

这一点可以看官网说明:

在这里插入图片描述
即:Cargo这是Rust语言的包管理软件,后面我们开发Rust时,使用的也基本都是这个命令

三、第一个Rust程序

我们可以通过命令cargo new projectName来创建一个Rust项目

比如运行:cargo new hello-world

在这里插入图片描述
然后它就会为我们在当前目录中生成一个项目文件夹:
在这里插入图片描述

  • .git:这是一个隐藏文件夹,用于git软件实现版本管理,学习rust期间一般用不着,不用管
  • src:这是存放代码的地方,以后我们写的rust代码就放在这个文件夹里面
  • .gitignore:这同样是git使用的,用于忽略哪些类型文件,不进行版本管理,一般同样不用管

注意:git并不是rust的一部分,而是一个所有语言通用的版本控制工具,比如知名的github,便是用的git进行版本管理

  • Cargo.toml :这个文件就很重要了,cargo作为rust的包管理程序,就是通过这个文件知道你这个项目中需要哪些依赖库的

用记事本打开它,就能看到这样的内容:

在这里插入图片描述

对于你想要用到的库,直接写在[dependencies]项的下面即可,后面我会再对其进行详细介绍

然后来到src这个存放rust代码的目录里面:

在这里插入图片描述

这里面默认有一个main.rs文件,其中后缀.rs便是rust的简写,这个文件是rust项目中不可或缺的,因为它将作为项目的入口文件

不可更改这个文件的名称!否则后面的编译将会直接失败!

同样的,我们仍然可以用记事本打开它:
在这里插入图片描述
这里写的是一个函数:

  • fn:rust中的关键字,即为function的简写,代表后面跟着的是一个函数

  • main: 这个函数的名称,同样是不可更改的!因为这是程序的入口函数,程序将从这个函数开始顺序执行内部的代码

  • ():与前面的函数名、fn关键字与后面紧跟的{}组成一个完整的函数签名,最简单的函数就是:fn name(){}

  • {}:函数体,即这个函数要执行的代码,比如这里填写的是println!("Hello, world!");,就是说要打印出 “hello world”这个字符串

其中的println!是一个rust中的宏,用于简化我们输出一个字符串到控制台的步骤,如果你学过C/C++、python、java等等其它语言,前期学习过程中可以直接把它当作一个print函数即可,只是要注意它的后面有一个!然后再是()

这里同样注意,每一个语句的结尾用的;,不用则会报错

现在回到控制台,进入这个文件夹,然后来运行这段代码试一试:

运行代码的命令为:cargo run

在这里插入图片描述
然后就可以看到它成功运行并打印出了Hello World! 字符串

如果你学过C/C++,会发现到目前为止,rustC/C++会稍稍复杂一点,毕竟C/C++只需要一个源代码文件就能输出hello world了,而rust却一上来就给我们生成了这么多文件

但很快,你就会发现rust这种特点的好处,尤其是在后面开发项目时。

前面我们说了,rust是一个编译型的语言,所以会编译成二进制后次才能运行,我们可以在下面的目录中找到这个生成的exe程序:
在这里插入图片描述
不过直接点击它运行是不行的,因为前面的代码中我们只写了一个打印字符串的代码,打印完程序就结束了,所以你只能看到一个黑影闪过,后面我们会想办法解决这个问题

上面提到的这个cargo run命令即为编译并运行当前项目的意思

如果我只想编译,不运行呢?

那就可以使用命令:cargo build

其默认构建的是Debug版本,即可调试版本,直观的来说就是生成的exe程序会稍微比较大

我们也可以构建Release版本,使用命令:cargo build --release,直观来说,这个命令生成的可执行文件会较小

在这里插入图片描述
如果你还是觉得它比较大,那么我们还可以使用一些工具来进一步压缩它,可以让它只有几十kb,这个后面再提:

在这里插入图片描述

四、 IDE环境

从上面我们可以看到,即使是只用记事本,也是可以开发的,但那实在是太麻烦了,所以我们需要一个IDE环境,就像VS那样,有代码提示,可以极大提高我们的开发效率

但由于rust是一个比较新的语言,所以目前它还没有自己的专用IDE软件

但我们可以通过为一些编辑器安装插件的方式,来打造其成为一个可以写rust代码的IDE环境

本系列教程使用的是VSCode这款编辑器,它也是目前最受欢迎的一个编辑器

可以通过以下链接进行前往官网下载:vs code

在这里插入图片描述
可以选择自己合适的版本下载安装即可,上图箭头指代的是我安装的版本:x64 系统安装

但其实各个版本区别不大,看自己的喜好了

注意:下载完成后,可能需要重启一下电脑才能继续进行下面的步骤

在控制台中进入这个文件夹,然后输入:code .

在这里插入图片描述

这个code命令是vs code提供的命令,用于让VSCode这个软件打开一个文件夹

而后面紧跟的 .,指代的就是当前目录,意思就是用VScode 打开当前目录

然后你就能看到这个rust项目项目文件夹在VSCode中被打开了:
在这里插入图片描述
但VScode只是一个编辑器,所以我们还需要安装rust插件,来打造这个编辑器成为一个IDE,方法也很简单

点击左边的插件选项,然后在上面输入rust进行搜索,然后安装rust-analyzer即可:
在这里插入图片描述

这样就完成了rust的开发环境的配置

现在当你输出前几个字符时,就会自动弹出代码提示:
在这里插入图片描述
这时,你只需要按Enter键就可以自动帮你填充代码

现在想要运行代码也很简单了,只需要点击main函数上面的按钮,就可以直接运行:
在这里插入图片描述
然后就能看到输出了:
在这里插入图片描述

五、初识包管理

配置好IDE后,我们再来试一下rust官网提供的一个示例,来看看rust的包管理有多好用

比如我们想要在终端打印出下面这个图案:

在这里插入图片描述

这里就用到了ferris-says这个库

首先来到前面提到的Cargo.toml文件,然后在[dependencies]项添加这个库

[dependencies]
ferris-says = "0.2"

在这里插入图片描述
保存后,执行一次Cargo build命令(直接在vs code下面的终端中执行即可)

在这里插入图片描述
Cargo 就会自动为我们找到ferris-says这个库的 0.2版本,下载编译好,让我们可以直接在代码中使用

你可能也注意到了不知道什么时候,项目文件夹中多了一个Cargo.lock文件

这个文件用于记录我们当前项目用到的所有库以及依赖,是由cargo自动管理的,我们无需操心

现在来到代码中,让我们来使用一下这个库

use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};

fn main() {
    let stdout = stdout();
    let message = String::from("Hello fellow Rustaceans!");
    let width = message.chars().count();

    let mut writer = BufWriter::new(stdout.lock());
    say(message.as_bytes(), width, &mut writer).unwrap();
}

第一次看上去,你可能会感觉怎么有点复杂啊?

因为这一小段代码就涉及到了rust中相当多的概念,所以我们暂时并不会讲解这段代码的逻辑,你可以自己随意更改这段代码里面的字符串:"Hello fellow Rustaceans!"

然后运行上面这段代码:
在这里插入图片描述
就能成功输出这个图案了!

而这个库的下载安装位置默认为当前用户文件夹的.Cargo文件夹中

在这里插入图片描述

六、总结

这是该系列教程的第一章,主要介绍了rust的特点、安装、项目结构、IDE环境配置、代码运行

主要有以下几个命令需要稍微记忆一下:

  • cargo new:新建一个rust项目
  • cargo run :直接运行代码
  • cargo build :只编译代码,不运行,默认编译的为debug版本
  • cargo build --release:编译为release版本

注意安装库时,也是直接用cargo build命令,它构建项目的时候一旦发现了有多的依赖库,就会自行为我们下载编译

下一章,我们就开始详细讲解rust的基础语法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/449800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++类和对象 (3)

类和对象 1. 类的6个默认成员函数2. 构造函数2.1. 概念(问题提出)2.2. 特性 3.析构函数3.1. 概念3.2.特性 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在…

使用OpenFeign实现接口访问

1. 引言 在微服务横行的年代,后端根据业务的不一样分成了很多单独运行的服务,比如在物联网中,根据业务拆分为定时服务、设备控制等服务。当前端想控制设备时,其请求首先到其对应的后端服务,后端服务再调用设备控制服务…

Vue+Vant封装通用模态框单选框组件

前言 我们知道,在vant组件中提供的组件往往是比较基础的,能够满足基本需求。但是我们想实现ui设计的一些比较丰富效果的组件,需要自己去实现,且当项目中多次用到的时候,我们将以组件化的思想将其封装起来,…

Node.js -- 使用Express写接口

1.创建基本的服务器 //导入express const express require(express) //创建服务器实例 const app express() //调用app.listen方法,指定端口号并启动web服务器 app.listen(80,function(){console.log(Express server running at http://127.0.0.1) })2. 创建API路…

路由交换综合实验

拓扑结构: 要求 1、R6为网络运营商(ISP),接口IP地址均为公有地址;该设备只能配置IP地址,之后不能在对其进行任何配置; 2、R1~R5为局域网,私有IP地址192.168.1.0/24,请合…

真题详解(UML图)-软件设计(五十五)

真题详解(计算机知识)-软件设计(五十四)https://blog.csdn.net/ke1ying/article/details/130278265 组织域名: com商业组织 edu教育组织 gov政府组织 net主要网络支持中心 mil军事部门 Int国际组织 2、时间复杂度 O&#…

写一个自己的命令行解释器

写一个自己的命令行解释器 当我点开xshell运行服务器的时候bash就被加载到了内存中,此后我在bash上执行的所有程序都是作为bash的子进程。在bash这个进程内创建子进程,并让子进程去执行全新的代码,这不就是程序替换吗? 所以我们…

腾讯云4核8g服务器支持多少人在线使用?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

【Unity入门】17.脚本访问父子结点

【Unity入门】脚本访问父子结点 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)父级节点 (1)访问父级节点 父子关系我们并不陌生,在cocos中常用node:get…

单链表的实现

链表的概念与结构 链表与我们通讯录中的顺序表是不同的,顺序表的空间是连续的,像数组一样可以通过下标访问。而链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。即:链表…

数据结构笔记:二叉树的遍历与技巧

引言 本篇是最近有遇到过的一个题目,关于二叉树的遍历,正好有一些经验与技巧,所以开一篇帖子记录一下。 二叉树遍历介绍 遍历是数据结构中常见的操作,主要是将所有元素都访问一遍。对于线性结构来说,遍历分为两种&a…

RecyclerView 静态布局实现过程解析:如何构建高性能的列表

作者:maxcion Recyclerview在日常开发中所使用的控件中绝对是顶流一般的存在,想嚼它这个想法一次两次了。在网上也看了很多关于Recyclerview源码解析的文章,大佬们写的都很深刻,但是对于像我们这种储备知识不足的小白读者来说&…

前端实现端到端测试(代码版)

端到端测试框架选取 playwright 、 cypress 、 selenium 对比 cypress使用 下载 cypress npm install cypress --save-dev package.json npm run cypress:open {"scripts": {"cypress:open": "cypress open"} }使用流程 入门官方文档 npm ru…

一本通 3.4.5 最小生成树

1348:【例4-9】城市公交网建设问题 【题目描述】 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点&…

SQL Server基础 第四章 select定制查询(select中的各种查询筛选条件)

本章主要介绍 select 语句查询数据的基本用法,其中包括查询指定字段信息、条件查询等。 目录 1、比较运算符、逻辑运算符 (1)查询phone大于500且不是单县的 (2)查询地址为烟台或者单县但是phone要大于666的 &#…

IMX6ull 之 HelloWorld Led点灯

一 GPIO点灯,嵌入式的helloworld 1 何为GPIO? GPIO只是一个CPU内提供的一种功能外设,CPU外部的I/O引脚会被赋予一种功能(GPIO、UART、I2C等);该功能由CPU内外设提供,具体是什么功能由IOMUX…

刷题笔记4-22

目录 1.Java:(a,b)>Math.abs(a-3)-Math.abs(b-3); 2.字符解释 3.C语言二维数组中a[i]表示ai的地址,而a[i]又可以表示为*(ai) 4.二维数组在传参时,必须给定列 5.软件开发:观察者模式 6.建…

shell脚本控制

shell脚本编程系列 处理信号 Linux利用信号与系统中的进程进行通信,通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。 Linux信号 shell脚本编程会遇到的最常见的Linux系统信号如下表所示: 在默…

【ros】6.ros激光雷达SLAM(建图定位)

百行业为先 ,万恶懒为首。——梁启超 文章目录 :smirk:1. 激光SLAM:blush:2. 二维激光SLAM:satisfied:3. 三维激光SLAM 😏1. 激光SLAM SLAM(同步定位与地图构建)是一种机器人感知技术,用于在未知环境中同时确定机器人…

java调用webservicer的方法

对于使用 Webservicer的方式,一般采用 Java API调用的方式。Webservicer是一个运行在浏览器中的客户端程序,它可以通过 Webservicer的接口来访问服务器上的服务。 使用 Java调用 Webservicer有两种方式: 下面是一个简单的例子: 2、…