Rust学习笔记:基础概念介绍(一)

2620a429e01a5428eb6df6eecc80d3b5.jpeg

Rust背景

让我们从Rust语言的背景开始,探索它的起源。Rust最初是Mozilla研究院在2006年的一个个人项目。第一个稳定的公开版本发布于2015年5月,但在此之前Mozilla已经在生产软件中使用了Rust。2021年,Rust基金会成立,其宪章是管理Rust发布路线图和语言治理。多年来,许多大公司(如亚马逊、谷歌、微软、Meta等)采用Rust进行系统和应用程序开发。截至撰写本文时,当前的发布版本是1.74.0。

Rust被认为是一种重要的语言,主要原因是它的执行速度、内存管理/安全性以及并发能力。

与其他语言相比,Rust程序免受以下问题的困扰:

  • 悬空指针

  • 数据竞争

  • 缓冲区溢出

  • 迭代器失效

当你开始使用Rust时,我发现最令人沮丧但同时也最有益的能力是,编译器几乎会引导你编写正确的代码。但它非常挑剔。Rust是一种静态且强类型的语言。变量类型必须在编译时已知,试图将一种类型的变量赋值给另一种类型的变量会导致编译错误。编译器会提供尽可能多的信息,甚至是解决方案。

下面是一个尝试将字符串传递给无符号整数变量的人为示例。

8bfe46ff19ca9f74a7ad3ec40c9d8502.jpeg

不用担心上面的代码,现在只关注以下几行,解释究竟发生了什么。它告诉我们问题出现在第3行,以及具体的问题是什么。我们将在本文的后续部分以及未来的文章中进一步探讨为什么会发生这种类型错误。

3 | let j : u32 = i;
  | — — ^ expected `u32`, found `String`

Rust安装指南

在探索Rust的过程中,我们会发现其工具链非常出色,从安装开始就不例外。

Rustup

Rustup 是安装 Rust 的工具,它允许用户在稳定版、测试版和夜间版编译器构建之间切换,并且可以在每个类别中保持更新到新版本。它在Rust支持的所有平台上运行。我们将探讨提供的文档,Rustup 有自己的书籍可以在这里找到。

访问 https://rustup.rs/,它会尝试检测您的操作系统并展示安装Rust的方法。在我的Mac上,它检测到Unix系统并提供了curl安装方法。但使用Homebrew安装会更简单。

brew install rustup

安装完成后,运行以下命令来初始化您的Rust环境。

rustup-init

然后通过运行以下命令来验证。

rustc --version

您可以通过运行以下命令来确保拥有最新版本。

rustup upgrade

如果有最新版本可用,它将安装该版本。Rust的升级周期相对较频繁,因此您可能需要比使用其他语言时更频繁地运行此命令。

如果您想知道像rustc、cargo和rustup这样的工具安装在哪里,请查看 $HOME/.cargo/bin 目录。

Visual Studio Code

虽然有几种IDE可用于Rust,但我发现Visual Studio Code非常好用。假设您已经使用rustup安装了Rust,并且安装了Visual Studio Code,您会想安装“rust-analyzer”扩展。我还安装了“rust”扩展。

44e80645e5fb4b8957ca3b2c28b2a30f.jpeg

在Mac上,您还需要运行以下命令来启用从命令行启动VS Code。在VS Code中通过运行以下命令来完成此操作。

通过⌘⇧P打开命令面板,并键入shell command来找到Shell Command:

在执行“Install ‘code’ command in PATH”命令之前,先使用“Uninstall ‘code’ command in PATH”命令。

a47da12bc1d6bcef6403cd60f543d5dd.jpeg

执行该命令后,您就可以在任何文件夹中简单地键入 code . 来打开VS Code并开始编辑该文件夹中的文件。

Rust Playground

在Rust的入门讨论中,如果不提到这个对语言学习者来说神奇的工具,那就不完整了。如果你想尝试运行Rust代码,却不想安装它,或者你想快速测试一些代码,可以使用Rust Playground:
https://play.rust-lang.org/。这是一个功能齐全的Rust环境,允许你交互、调试甚至分享你的Rust代码。

Rust Playground拥有很多优秀的功能。这包括访问用于格式化或审查Rust代码的工具(我们将在下面探讨这些)。如你所见,它甚至能轻松地与他人分享代码,比如,通过点击这个链接:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=94762255ffdfc1bf6ca26a6ec10154b9

Cargo

Cargo是Rust的构建系统和包管理器。Cargo为你处理许多任务,如构建代码、下载代码依赖的库以及构建这些依赖。我发现使用Cargo是管理Rust项目最简单的方式。

% cargo --version
cargo 1.74.0 (ecb9851af 2023-10-18)

这是我当前系统上的结果,因为我正在运行Rust 1.74.0。

Cargo允许高效管理新项目,让我向你展示我觉得有用的流程。

cargo new hello_cargo

cd hello_cargo

code .

这将创建一个带有依赖管理文件、git文件的新项目,切换到那个目录,然后用VS Code打开那个文件夹。

创建的依赖管理文件名为Cargo.toml。toml是Cargo的配置格式。

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

# 详细信息请见 https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

Cargo希望你的源文件位于src目录内。

如果你通过其他方式开始一个项目,可以通过确保项目代码在src目录内,并创建一个适当的Cargo.toml文件(如上所示),轻松将其转换为使用Cargo的项目。

常用的Cargo命令包括:

# 清理项目的构建产物
cargo clean

# 检查是否能编译,但不进行构建
cargo check

# 构建项目
cargo build

# 构建不带调试信息的发布版本
cargo build --release

# 运行项目
cargo run

# 打开包含项目文档的页面(包括任何///注释)
cargo doc --open

# 自动修复代码问题
cargo fix

Crate(箱)

在Rust中,crate是编译器一次考虑的最小代码单元。crate有两种形式:二进制crate和库crate。二进制crate是你可以编译成可执行文件的程序,比如命令行程序或服务器。这些程序有一个叫做main的函数。Crate可以包含模块,这些模块可能在其他文件中定义。

库crate没有main函数,它们不编译成可执行文件。相反,它们定义的功能旨在与多个项目共享。

包(package)是一个或多个crate的捆绑,提供一组功能。包含一个Cargo.toml文件,描述如何构建这些crate。

在本系列后续文章中,我们将看到如何将应用程序分割成不同的crate、包和模块的示例。

工具

rustfmt

rustfmt是一个工具,用于根据社区代码风格指南格式化Rust代码。它是非常可配置的,你可以创建一个名为rustfmt.toml的文件,并设置这里找到的任何参数来格式化你的代码。

直接运行:

rustfmt main.rs

由于我发现Cargo是所有命令行工具的首选选项,我只需简单运行:

cargo fmt

注意,rustfmt也是Rust Playground中TOOLS下的一个选项。

clippy

Clippy工具是一组静态代码分析规则的集合,用于标记编程错误、bug、风格错误和可疑结构。Clippy用于分析你的代码,以便你可以捕捉常见错误并改进你的Rust代码。

它可以通过输入以下命令简单运行:

cargo clippy

注意,clippy也是Rust Playground中TOOLS下的一个选项。

Primitive Types

在本文的最后一部分,我们将探讨Rust支持的原始类型(primitive types)。

Rust中最简单的类型被称为原始类型。这些包括数字、字符和字符串。我们将从整数类型开始,即没有小数点的整数。整数类型分为有符号和无符号两种。

有符号整数类型以字母‘i’开头,大小范围从8到128,如下所示。

  • i8

  • i16

  • i32

  • i64

  • i128

无符号整数类型以字母‘u’开头,大小范围同样从8到128,如下所示。

  • u8

  • u16

  • u32

  • u64

  • u128

Rust使用usize作为索引的大小。usize是用于索引的最佳大小,因为索引不能为负数,允许在大型索引空间中灵活使用,并且需要适应32位计算机。

只要源变量中的内容能够适应目标变量类型的最大值,你就可以在不同整数类型之间进行赋值。下面是一个例子。如果将第二行改为128,则第四行将失败,因为i8类型的最大值是127,而我们声明它为i8。

fn main() {
    let mut i = 127;
    let j: i8 = 12;
    i = j;
    println!("{}", i)
}

我们将在后面讨论mut关键字的使用,但现在只需知道它允许在声明后对i进行赋值。默认情况下,变量是不可变的(不允许被更改)。

如果未声明类型,则整数的默认大小为i32,所以上面的变量i将是i32类型。

浮点数是带有小数点的数字。10.5是一个浮点数,而2是一个整数。就像整数一样,它们由诸如f32或f64之类的类型定义。也像整数一样,如果环境支持,f64是默认的浮点数类型。

字符(char)类型始终使用4个字节。但字符串不同,单个字符不总是使用4个字节。当字符是字符串的一部分(而不是char类型)时,字符串被编码为使用每个字符所需的最少内存量。

字符的大小和字符串的变化如下面的代码片段所示。

use std::time::{Instant};

fn main() {
    let now = Instant::now();
    println!("Size of a char: {}", std::mem::size_of::<char>());
    println!("Size of a: {}", "a".len());
    println!("Size of ñ: {}", "ñ".len());
    println!("Size of 国: {}", "国".len());
    println!("Size of : {}", "".len());
    let now2 = Instant::now();
    println!("==> {} ms", now2.duration_since(now).as_micros());
}

结果如下。请注意,还添加了一些代码来显示微秒级的运行时长。

Size of a char: 4
Size of a: 1
Size of ñ: 2
Size of 国: 3
Size of : 4
==> 6773 ms

请注意,.len()方法返回的是字节数,而不是字母数。

上面的例子展示了如何从Instant库中包含一个标准库函数,now()。这是在顶部使用use关键字包含的。

每种类型的详细信息可以在这里找到。

https://doc.rust-lang.org/reference/types.html

总结

这篇文章为学习Rust语言打下了基础。我们探讨了安装Rust、运行程序的替代方案、基本工具以及Rust中可用的原始数据类型的概述。在下一节中,我们将探讨内存管理的重要话题,以及借用(borrowing)、遮蔽(shadowing)、所有权(ownership)以及不可变性等概念。理解这些概念,其中一些是Rust独有的,对于精通这种语言至关重要。

Rust的内存管理是其核心特性之一,不同于传统语言如C或C++中的手动内存管理,Rust通过所有权系统自动处理内存,旨在减少内存泄漏和其他常见错误。在Rust中,每一个值都有一个被称为其“所有者”的变量,值在任何时候都只能有一个所有者。当所有者离开作用域时,值将被丢弃。

借用是Rust中另一个重要概念。它允许我们创建指向数据的引用,但不取得所有权。这意味着数据可以被多个部分的代码安全地访问,而不会引起数据竞争或其他问题。

遮蔽则允许我们重新使用变量名。这意味着你可以在同一个作用域内声明一个新的同名变量,新变量会“遮蔽”掉旧变量。

不可变性是Rust的另一个核心概念。在Rust中,默认情况下,所有变量都是不可变的。这增加了代码的安全性和清晰性。当然,如果需要,你可以通过使用mut关键字明确指定可变性。

通过了解和掌握这些概念,你将能够更有效地编写Rust代码,并充分利用Rust提供的安全和性能优势。

在我们的下一篇文章中,我们将深入探讨这些概念,并通过实际示例来展示它们在Rust编程中的应用。我们还将探讨Rust的错误处理机制和模式匹配,这是Rust提供的另一组强大功能。

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

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

相关文章

1、设计模式概述

1.1 软件设计模式的产生背景 1.2 软件设计及模式的概念 1.3 学习设计模式的必要性 1.4 设计模式分类 创建型模式 用于描述“怎样创建对象”&#xff0c;它的主要特点是“将对象的创建与使用分离”。GOF书中提供了单例、原型、工厂方法、抽象工厂、建造者等5种创建者模式。 结构…

【SkyWant.[2304]】路由器操作系统,移动【Netkeeper】使用教程校园网

目录 步骤一&#xff1a;正确连接网线&#xff0c;插电开机正确连接网线&#xff1a; 认识系统灯&#xff1a; 插电开机&#xff1a; 步骤二&#xff1a;开机之后&#xff0c;系统的基本设置 1.进入设置界面&#xff1a; 2.设置辅助热点wifi&#xff1a; 3.设置日常…

Mysql InnoDB行锁深入理解

Record Lock记录锁 Record Lock 称为记录锁&#xff0c;锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的&#xff1a; 当一个事务对一条记录加了 S 型记录锁后&#xff0c;其他事务也可以继续对该记录加 S 型记录锁&#xff08;S 型与 S 锁兼容&#xff09;&#xff0c;…

SQL基础知识1

一、基本知识 1、定义 2、语句结构 二、库和表的操作 1、创建、删除库 方法一 在navicat的查询中写 方法二 用mysql命令窗口写 1、用管理员身份运行MySQL的窗口 2、先看一下已经存在的数据库 3、新建数据库 2、导入表 方法一 用dos命令窗口&#xff0c;管理员身份运行…

LeetCode(242)有效的字母异位词⭐

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输…

大前端nestjs入门教程系列(四):如何nestjs整合mysql数据库

经过前面的几篇文章&#xff0c;想必大家已经对nestjs有了基础的了解&#xff0c;那么这篇文章就带大家玩玩数据库&#xff0c;学会了这篇&#xff0c;就离大前端又进了一步 Nest与数据库无关&#xff0c;使你可以轻松地与任何 SQL 或 NoSQL 数据库集成。 根据你的喜好&#xf…

【办公自动化】Window电脑如何设置定时任务计划

在Windows系统中&#xff0c;我们可以使用任务计划程序来创建和管理定时任务。任务计划程序是Windows操作系统自带的一个功能&#xff0c;可以帮助我们自动执行一些重复性的任务&#xff0c;例如备份文件、更新软件等。 一、打开任务计划程序 首先&#xff0c;我们需要打开任…

【YOLO系列】 YOLOv4思想详解

前言 以下内容仅为个人在学习人工智能中所记录的笔记&#xff0c;先将目标识别算法yolo系列的整理出来分享给大家&#xff0c;供大家学习参考。 本文未对论文逐句逐段翻译&#xff0c;而是阅读全文后&#xff0c;总结出的YOLO V4论文的思路与实现路径。 若文中内容有误&#xf…

跟我学java|Stream流式编程——Stream 基础

一、流式编程的概念和作用 Java 流(Stream)是一连串的元素序列&#xff0c;可以进行各种操作以实现数据的转换和处理。流式编程的概念基于函数式编程的思想&#xff0c;旨在简化代码&#xff0c;提高可读性和可维护性。 Java Stream 的主要作用有以下几个方面&#xff1a; 简化…

vite 如何设置 pwa,让网页类似 app 那样运行,使用插件 vite-plugin-pwa

vite 如何设置 pwa&#xff0c;让网页类似 app 那样运行&#xff0c;使用插件 vite-plugin-pwa 一、概述 情况还是那么个情况&#xff0c;还是原来的项目 vue2 改为 vitetsvue3 遇到的问题&#xff0c;今天这个问题是如何 在 Vite 环境下设置 PWA。 PWA 就是网页应用可以像 a…

GFP-CERTIFIED®FLUOFORTE®钙离子检测试剂盒

Enzo Life Sciences的GFP-CERTIFIED FLUOFORTE Calcium assay kit提供了一种荧光分析方法&#xff0c;用于检测广泛生物靶标的细胞内钙动员情况。相对于其他商业化的染料&#xff0c;GFP-CERTIFIED FLUOFORTE染料是最亮和最灵敏的荧光钙指示剂。该试剂盒为贴壁和非贴壁细胞系提…

国产CPU--飞腾信息技术有限公司

一、发展历程 飞腾CPU最早是国防科技大学立项研究的科技项目。 2014年&#xff0c;由中国电子信息产业集团、天津市滨海新区政府和天津先进技术研究院联合支持成立飞腾信息技术有限公司。目前&#xff0c;CEC通过中国长城控股公司28.04%股份&#xff0c;为公司最大股东。 二、…

外贸SaaS软件功能有哪些?

外贸SaaS软件功能有哪些&#xff1f;主要有客户管理&#xff0c;销售管理&#xff0c;库存&#xff0c;财务等管理&#xff0c;均是用过saas模式实现的客户端软件功能&#xff0c;这里以孚盟外贸saas软件为例&#xff0c;具体如下&#xff1a; 外贸SaaS软件的功能主要包括以下几…

小程序系列--6.WXSS 模板样式

一. 什么是 WXSS WXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于美化 WXML 的组件样式&#xff0c;类似于网页开发中的 CSS。 1.WXSS 和 CSS 的关系 二、rpx 1. 什么是 rpx 尺寸单位 rpx&#xff08;responsive pixel&#xff09;是微信小程序独有的&#x…

10个实用的产品说明书模板制作技巧

产品说明书是一个重要的工具&#xff0c;可以帮助用户理解如何使用和维护他们购买的产品。制作一个易于理解和使用的产品说明书对提高客户满意度和忠诚度具有重要价值。 而产品说明书模板是一种预先设计好的框架&#xff0c;它将设计、排版和内容结构的复杂性降到最低&#xf…

使用串口 DMA 模式接收不定长数据

一、简介 曾经遇到客户有一个需求&#xff0c;需要用串口 DMA 的方式接收不定长度的数据&#xff0c;DMA 有个缺点就是在每次传输前需要设定好传输的字节长度&#xff0c;这种方式显然对于接收不定长度的数据来说没有那么灵活。但 DMA 也有着显著的优点&#xff0c;如可直接访…

fail-safe 机制与 fail-fast 机制分别有什么作用

前段时间一个小伙伴去面试&#xff0c;遇到这样一个问题。 ”fail-safe 机制与 fail-fast 机制分别有什么作用“ 他说他听到这个问题的时候&#xff0c;脑子里满脸问号。那么今天我们来看一下&#xff0c;关于这个问题&#xff0c; 看看高手应该如何回答吧。 一、问题解析 fa…

MODBUS转PROFINET网关与全数字交流伺服配置案例

MODBUS转PROFINET网关连接与全数字交流伺服驱动系统的配置案例&#xff0c;这一通信方式极大地简化了工业自动化系统中的数据传输和控制过程。变频器和伺服电机可以实现数据交流和控制指令的实时传输&#xff0c;从而实现更精确更高效的生产过程。 案例简介&#xff1a;本案例是…

智慧灌溉解决方案(基于物联网的智能灌溉系统)

​ 详情&#xff1a;智慧水务数字孪生安全监测解决方案提供商-星创 (key-iot.com.cn) 随着农业IOT的快速发展,智慧灌溉正成为提高农业水资源利用效率,实现精准灌溉的重要技术手段。完整的智慧灌溉系统由实地各类传感设备以及后台管理软件平台组成,可以实现对整个灌区的监测和精…

MySQL 定时清理Binlog日志并自动清理

MySQL 定时清理Binlog日志并自动清理 MySQL的二进制日志&#xff08;Binlog&#xff09;对于数据库的恢复和复制是至关重要的。然而&#xff0c;随着时间的推移&#xff0c;这些日志文件可能会占据大量存储空间。因此&#xff0c;及时而安全地删除这些日志文件变得非常重要。 …