Rust语言入门教程(一) - 简介及Cargo使用

Rust编程入门

为什么学习Rust

我本人是一个DevOps工程师,并不是专职的开发人员,但需要了解各种各样的语言的基本知识和特性,以便在不同的项目中帮助开发人员设计软件架构,部署流程以及进行错误排查和调试。但是对任何新生的优秀事物保持足够的好奇心,往往会给我们更多的机会,并产生新的思想火花,让我们先走马观花的看一看Rust是什么样子,说不定你就会对它产生浓厚的兴趣。

如果你决定了要学习这门语言,那么至少应该运用你所学的知识进行一些小的练习,甚至用它来写一个自己的项目。由于Rust的学习曲线还是比较陡峭,因此在实践中总结并进步是十分重要的。请添加图片描述
如上图所示,也许你的代码通过编译都需要花费很大的力气,而这就要求你对Rust的基础知识掌握牢固,否则这样陡峭的学习曲线很容易让初学者从入门到放弃。

Rust的简介及历史

Rust是一门系统编程语言,它提供了一些优秀的特性:

  • 内存安全: 在编译阶段就保证了内存的安全;
  • 无畏并发: 由于更优秀的安全性,所以在进行并发编程时更加无所畏惧,因为所有的不安全因素都会在编译时被发现;
  • 快速:由于零成本的抽象和其他优秀特性,Rust具有惊人的运行速度和性能;

相比之下, 一些高级语言如Ruby和Python虽然可以保证内存安全, 但是却很难做到高并发和高性能。 一些系统编程语言如C语言和C++, 虽然可以获得高性能,以及一定程度上的高并发,但是却总是被内存安全问题所困扰。

Rust起源于2006年,最初是Mozilla公司的一名雇员Graydon Hoare的个人项目。 Mozilla公司从2009年开始赞助Rust的开发, 并于2015年首次发布了Rust的1.0版本。因此, Rust至今(2023)已经有8年的历史了,并且还有9年的孵化期。相比之下, C++已经有38年的历史, 而C语言已经有48年的历史了。

Mozilla赞助Rust的原因正是因为受够了C++的内存安全问题,而想要寻找一种更好的语言来开发Firefox浏览器。 2017年发布的Firefox quantum就是用Rust重写的, 它的运行速度是以前版本的两倍多,而且使用中出现的bug大大的减少了。目前在Firefox的代码中约有150多万行的代码是Rust编写的。

Cargo

Cargo是一个非常好用的Rust工具,在我们学习并使用Rust的过程中,Cargo会贯穿始终。

  • Cargo = Package Manager。一门系统编程语言, Rust居然会有专门的包管理器,这不得不让人惊喜。Cargo可以用于查找,安装并管理我们需要使用的Rust包;
  • Cargo = Build System。没有什么Makefile, Cargo就是Rust的Build System;
  • Cargo = Test Runner. 直接使用Cargo运行测试;
  • Cargo = Doc Generator. 用Cargo生成文档;

Cargo集成了其他各种工具的优点和功能,如npm, pip, bundler, make.

创建第一个Rust项目

假设你已经安装好了Rust, 现在你就可以用Cargo命令来创建一个Rust项目。

cargo new hello

将会看到下面的输出和目录结构:
在这里插入图片描述
可以看到, Cargo为我们创建了一个名为hello的目录, 里面包含:

  • 一个toml格式(Tom’s obvious minimal language)的项目配置文件;
  • 源代码目录src, 里面包含main.rs文件,是程序运行的入口, 可见Rust的源代码文件后缀是.rs

现在我们来看一下Cargo.toml这个项目配置文件:

[Package]
name = "hello"      
version = "0.1.0"
authors = ["Nathan Stocks <nathan.stocks@gmail.com>"]
edition = "2018"

[dependencies]

其中:

  • name: 项目的名称, 与目录名称和Git Repo的名称都无关;
  • version: 项目的当前版本号, 格式是Semantic Versioning
  • authors: 项目作者, 是一组名字加email地址, Cargo会自动从一些可能的位置查找这个值并自动填入, 比如在你的Git Config文件中就很可能有这个信息;
  • editipn: 应该是最新的版本(2018), 如果Cargo没有自动生成这一行的话,说明你的rust版本较低,你应该运行rustup update升级你的Rust版本;
  • dependencies: 项目所需的依赖包,后面的章节中再细说;

再来看一下main.rs的内容:

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

Cargo已经为我们编写了一个Hello world示例代码,我们可以直接运行。
在这里插入图片描述
可以看到, Cargo会先编译代码,并运行出执行结果,在终端打印出Hello, world! 如果我们再运行一次代码,将会出现下面的输出:请添加图片描述
由于我们的代码并没有变化,所以第二次运行的输出中可以看到Cargo并没有对代码进行重新编译。

当我们运行上述命令时,实际上Cargo已经构建了一个可执行文件并运行,它的位置是:

target/debug/hello

这个目录下会存放Cargo构建的所有产物,因此在.gitignore文件中应该加入这个目录,以防这些构建产物提交到git仓库中。我们可以直接运行这个可执行文件, 得到与cargo run同样的结果:
请添加图片描述
我们注意到, hello这个可执行文件在debug目录下, 这是因为默认情况下, Cargo会以debug模式编译我们的代码,如果想不以debug模式编译,则需要加上--release参数, 请添加图片描述
这样的话,大多数代码执行的速度会更快,但编译的时间可能会更长,构建产物会保存在target/release/目录下。

小结

本章介绍了Rust语言的历史和主要特性,以及如何用Cargo进行一个Demo项目的创建和运行。下节会介绍Rust语言的一些基础概念及使用,如变量,作用域等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux常用命令——blkid命令

在线Linux命令查询工具 blkid 查看块设备的文件系统类型、LABEL、UUID等信息 补充说明 在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备&#xff08;包括交换分区&#xff09;所使用的文件系统类型、LABEL、UUID等信息进行…

JavaScript异步编程

同步与异步 #先看 2 段代码 <span style"background-color:#282c34"><span style"color:#2c3e50"><span style"color:#cccccc"><code><span style"color:#999999">//代码1</span> <span styl…

C++学习之路(一)什么是C++?如何循序渐进的学习C++?【纯干货】

C是一种高级编程语言&#xff0c;是对C语言的扩展和增强。它在C语言的基础上添加了面向对象编程&#xff08;OOP&#xff09;的特性&#xff0c;使得开发者能够更加灵活和高效地编写代码。 C的名字中的“”符号表示在C语言的基础上向前发展一步&#xff0c;即“加加”&#x…

多功能回馈式交流电子负载的应用

多功能回馈式交流电子负载是用于模拟和测试电源、电池等电子设备的负载工具。它具有多种应用&#xff0c;可以用于测试和评估各种类型的电源&#xff0c;包括直流电源和交流电源。它可以模拟各种负载条件&#xff0c;如恒定电流、恒定电压和恒定功率&#xff0c;以验证电源的性…

电脑技巧:推荐八个非常实用的在线网站值得收藏

目录 1、wikihow 干货分享网站 2、次元小镇 二次元必备网站 3、AI创作家 4、SKRbt 搜索引擎网站 5、barbg 全球资源网站 6、书签地球 7、4KHDR世界 8、a real me 今天小编给大家推荐八个非常实用的在线网站值得收藏&#xff01; 1、wikihow 干货分享网站 这个网站是一…

微信小程序制作

如果你也想搭建一个小程序&#xff0c;但不知道如何入手&#xff0c;那么今天我就教你如何使用第三方制作平台&#xff0c;在短短三十分钟内搭建一个小程序。 一、登录小程序制作平台 首先&#xff0c;登录到小程序制作平台的官方网站或应用程序&#xff0c;进入后台管理系统。…

geemap学习笔记013:为遥感动态GIF图添加图名

前言 遥感动态GIF图可以展示地理区域随时间的变化&#xff0c;这对于监测自然灾害、湿地变化、城市扩展、农田变化等方面非常有用&#xff0c;并且可以反复观察图像&#xff0c;以更深入地了解地表的动态变化。本节主要是对遥感动态GIF图添加图名&#xff0c;以便于更好地理解…

【Redis】前言--redis产生的背景以及过程

一.介绍 为什么会出现Redis这个中间件&#xff0c;从原始的磁盘存储到Redis中间又发生了哪些事&#xff0c;下面进入正题 二.发展史 2.1 磁盘存储 最早的时候都是以磁盘进行数据存储&#xff0c;每个磁盘都有一个磁道。每个磁道有很多扇区&#xff0c;一个扇区接近512Byte。…

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02一字节并显示在液晶显示器LCD1602上应用

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02一字节并显示在液晶显示器LCD1602上应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍IIC通信简单…

【深度学习】如何选择神经网络的超参数

1. 神经网络的超参数分类 神经网路中的超参数主要包括: 1. 学习率 η 2. 正则化参数 λ 3. 神经网络的层数 L 4. 每一个隐层中神经元的个数 j 5. 学习的回合数Epoch 6. 小批量数据 minibatch 的大小 7. 输出神经元的编码方式 8. 代价函数的选择 9. 权重初始化的方法 …

IP 代理的基础知识有哪些?

本文将介绍流冠IP代理的基础知识&#xff0c;帮助您了解IP代理的概念、类型、作用、设置方法和注意事项。 一、IP代理的概念 IP代理是一种网络代理服务&#xff0c;它通过代理服务器帮助用户访问互联网&#xff0c;并将用户的请求转发到目标网站&#xff0c;同时将目标网站的响…

Pycharm 教育版下载

1 访问 Jetbrains 主站-->Developer Tools-->PyCharm JetBrains: Essential tools for software developers and teams 2 页面往下划找到 PyCharm for Education-->CHECK IT OUT! PyCharm: the Python IDE for Professional Developers by JetBrains 3 点击 Downloa…

【SpringMVC】 对请求的不同响应

前言 本文学习如何运用不同的注解来返回不同的响应. 1.返回静态页面Controller 返回index.html页面 Controller 和 RestController的区别 controller 只有加上这个注解,Spring才会帮我们管理这个代码.后续我们访问时才能访问到. RestController 等同于 Controller ResponseBo…

域控操作五:统一熄屏睡眠时间

直接看图路径&#xff0c;我只设置了熄屏&#xff0c;如果要睡眠就下面那个启用设置时间

Elasticsearch基础教程

​ Elasticsearch是一个实时的分布式搜索分析引擎&#xff0c;底层基于Lucene实现。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;并且客户端可以使用标准的RESTful进行访问。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xf…

python树的双亲存储结构

这种存储结构是一种顺序存储结构&#xff0c;采用元素形如“[结点值&#xff0c;双亲结点索引]”的列表表示。通常每个结点有唯一的索引(或者伪地址&#xff09;,根结点的索引为0&#xff0c;它没有双亲结点&#xff0c;其双亲结点的索引为-1。例如&#xff0c;所示的树对应的双…

NVM得介绍和详细使用教程

NVM​​​​​​​&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具。它允许您在同一台计算机上轻松地切换和管理不同的Node.js版本。以下是NVM的介绍和详细使用教程&#xff1a; 安装NVM&#xff1a; 首先&#xff0c;您需要在计算机上安装N…

一文2000字使用JMeter进行接口测试教程!(建议收藏)

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Cho…

【开源】基于Vue.js的固始鹅块销售系统

项目编号&#xff1a; S 060 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S060&#xff0c;文末获取源码。} 项目编号&#xff1a;S060&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…

【miniQMT实盘量化5】获取财务报表数据

前言 上面文章&#xff0c;我们介绍了如何获取实时数据&#xff0c;这篇文章&#xff0c;我们继续往下探讨&#xff0c;介绍关于财务报表数据的获取。 财务报表数据 财务报表数据&#xff0c;也就是常说的基本面数据&#xff0c;是除了行情数据之外&#xff0c;辅助我们投资…