01-开始Rust之旅

1. 下载Rust

        官方推荐使用 rustup 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要连接互联网。

        这边提供了离线安装版本。本人学习的机器环境为: ubuntu x86_64,因此选用第②个工具链;

                1. rust-1.75.0-x86_64-pc-windows-gnu.msi

                2. rust-1.75.0-x86_64-unknown-linux-gnu.tar.gz

$ rustc --version

rustc 1.75.0 (82e1608df 2023-12-21)

2. 编写和运行 Rust 程序

    Rust 对编辑、工具或代码的存放位置没有特别的要求,因此如果你喜欢使用集成开发环境(IDE)而不是命令行,请随意使用你喜欢的集成开发环境。许多集成开发环境现在都在一定程度上支持 Rust;Rust 团队一直致力于通过 rust-analyzer 实现对集成开发环境的强大支持。

    vscode可直接安装rust-anslyzer插件;

        创建一个新的源文件,并将其命名为 main.rs。Rust 文件总是以 .rs 扩展名结尾如果你在文件名中使用了多个单词,惯例是使用下划线分隔它们。例如,使用 hello_world.rs 而不是 helloworld.rs。

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

        保存文件,在 Linux输入以下命令编译并运行文件:

$ rustc main.rs
$ ./main
Hello, Rust!

2.1 Rust 程序剖析

        这几行定义了一个名为 main 的函数。 main 函数很特别:它总是每个可执行 Rust 程序中运行的第一段代码。这里,第一行声明了一个名为 main 的函数,该函数没有参数,也不返回任何内容。如果有参数,则会放在括号 () 中。

        函数体用 {} 封装。Rust 要求在所有函数体周围使用大括号。好的做法是将开头的大括号与函数声明放在同一行,中间空一格

注意:如果你想在 Rust 项目中坚持使用一种标准样式,可以使用一个名为 rustfmt 的自动格式化工具,以特定样式格式化你的代码。Rust 团队已将该工具包含在标准 Rust 发行版中,就像 rustc 一样!

        main 函数的主体包含以下代码:

    println!("Hello, Rust!");

        这一行完成了这个小程序的所有工作:将文本打印到屏幕上。这里有四个重要细节需要注意:

        首先,Rust 风格是缩进四个空格,而不是制表符。

        其次, println! 调用的是 Rust 宏。如果它调用的是一个函数,就会以 println 的形式输入(去掉 ! )。使用 ! 意味着你调用的是宏而不是普通函数,而且宏并不总是遵循与函数相同的规则

        第三,您将看到 "Hello, world!" 字符串。我们将这个字符串作为参数传递给 println! ,然后字符串就会被打印到屏幕上。

        第四,我们用分号 ( ; ) 结束这一行,表示这个表达式结束,下一个表达式准备开始。Rust 代码的大多数行都以分号结束

2.2 编译和运行是不同的步骤

        在运行 Rust 程序之前,您必须使用 Rust 编译器对其进行编译,方法是输入 rustc 命令并将源文件的名称传给它,就像这样:

rustc main.rs

        如果你有 C 或 C++ 背景,就会发现这与 gcc 或 clang 类似。编译成功后,Rust 会输出一个二进制可执行文件。

g++ -o demo demo.cpp

        接着,运行main可执行程序,在终端即可输出"Hello, Rust"文本。

./main

        对于简单的程序来说,只用 rustc 进行编译就可以了,但随着项目的发展,你会希望管理所有选项,并方便共享代码。接下来,我们将向你介绍 Cargo 工具,它将帮助你编写真实世界的 Rust 程序。

3. Cargo

        Cargo 是 Rust 的构建系统和软件包管理器。大多数 Rustaceans 都使用这个工具来管理他们的 Rust 项目,因为 Cargo 可以为你处理很多任务,例如构建代码、下载代码所依赖的库,以及构建这些库。(我们把代码需要依赖的库称为依赖库)。

从这一点上看,和Android中的Gradle很像;

        最简单的 Rust 程序,比如我们目前编写的程序,不需要任何依赖库。如果我们用 Cargo 构建了 "Hello, Rust!"项目,它将只使用 Cargo 中负责构建代码的部分。当你编写更复杂的 Rust 程序时,你会添加依赖关系,如果你使用 Cargo 启动一个项目,添加依赖关系就会容易得多。

        请在终端输入以下命令检查 Cargo 是否已安装:

$ cargo --version
cargo 1.75.0 (1d8b05cdd 2023-11-20)

3.1 用Cargo创建项目

        让我们使用 Cargo 创建一个新项目,看看它与最初的 "Hello, Rust!"项目有何不同。回到你的项目目录(或你决定存储代码的地方)。然后,在任何操作系统上运行以下命令:

$ cargo new hello_cargo
$ cd hello_cargo

        第一条命令会创建一个名为 hello_cargo 的新目录和项目。我们将项目命名为 hello_cargo,Cargo 会在同名目录下创建文件。

        进入 hello_cargo 目录并列出文件。你会看到 Cargo 为我们生成了两个文件和一个目录:一个 Cargo.toml 文件和一个包含 main.rs 文件的 src 目录。

        它还初始化了一个新的 Git 仓库和一个 .gitignore 文件。如果在现有的 Git 仓库中运行 cargo new ,则不会生成 Git 文件;您可以使用 cargo new --vcs=git .

    注:Git 是一种常见的版本控制系统。您可以使用 --vcs 标志更改 cargo new 以使用其他版本控制系统或不使用版本控制系统。运行 cargo new --help 查看可用选项。

        在文本编辑器中打开 Cargo.toml。它应该与下面代码相似。

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

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

        该文件采用 TOML(Tom's Obvious, Minimal Language)格式,是 Cargo 的配置格式。

        第一行 [package] 是一个章节标题,表示下面的语句正在配置一个软件包。当我们向该文件添加更多信息时,我们将添加其他部分。

        接下来的三行设置了 Cargo 编译程序所需的配置信息:名称、版本和要使用的 Rust 版本。

        最后一行, [dependencies] ,是列出项目依赖关系的开头部分。在 Rust 中,代码包被称为 crates。在本项目中,我们不需要任何其他依赖部分。

        现在打开 src/main.rs,看一看:

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

        Cargo 已经为你生成了一个 "Hello, world!"程序,就像我们之前编写的程序一样!到目前为止,我们的项目与 Cargo 生成的项目之间的区别在于:Cargo 将代码放在了 src 目录中,在顶层目录中添加了一个 Cargo.toml 配置文件。

        Cargo 希望你的源文件位于 src 目录中。项目顶层目录只用于存放 README 文件、许可证信息、配置文件以及其他与代码无关的内容。使用 Cargo 可以帮助你组织项目。每样东西都有自己的位置,每样东西都有自己的位置。

        如果你启动了一个不使用 Cargo 的项目,就像我们的 "Hello, world!"项目一样,你可以将它转换成一个使用 Cargo 的项目。将项目代码移至 src 目录,并创建一个合适的 Cargo.toml 文件。

3.2 构建及运行Cargo项目

        现在,让我们看看使用 Cargo 构建并运行 "Hello, world!"程序时会有哪些不同!在 hello_cargo 目录下,输入 cargo build 命令构建项目:

$ cargo build
   Compiling hell_cargo v0.1.0 (/home/username/rustProj/hell_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s

        该命令会在 target/debug/hello_cargo 中创建一个可执行文件,而不是在当前目录下。由于默认编译是调试编译,因此 Cargo 会将二进制文件放到名为 debug 的目录中。你可以用这条命令运行可执行文件:

$ ./target/debug/hell_cargo 
Hello, world!

        如果一切顺利, Hello, world! 将打印到终端。首次运行 cargo build 还会导致 Cargo 在顶层创建一个新文件:Cargo.lock。该文件记录了项目中依赖项的确切版本。本项目中没有依赖项,所以文件有点少。你不需要手动修改这个文件,Cargo 会帮你管理它的内容

# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3

[[package]]
name = "hell_cargo"
version = "0.1.0"

        我们刚用 cargo build 构建了一个项目,然后用 ./target/debug/hello_cargo 运行了它,但我们也可以用 cargo run 编译代码,然后在一条命令中运行生成的可执行文件:

cargo run
   Compiling hell_cargo v0.1.0 (/home/username/rustProj/hell_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s
     Running `target/debug/hell_cargo`
Hello, world!

        使用 cargo run 比记住运行 cargo build 然后使用二进制文件的整个路径更方便,因此大多数开发人员使用 cargo run 。

        请注意,当我们再次运行 cargo run 时,这次我们没有看到 Cargo 正在编译 hello_cargo 的输出。Cargo 发现文件没有变化,所以没有重建,只是运行了二进制文件

cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/hell_cargo`
Hello, world!

        如果你修改了源代码,Cargo 会在运行前重建项目。

和Makefile功能类似;

        Cargo 还提供了一个名为 cargo check 的命令。该命令可快速检查您的代码,确保其可编译但不会生成可执行文件:

cargo check
    Checking hell_cargo v0.1.0 (/home/username/rustProj/hell_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s

        为什么不需要可执行文件?通常, cargo check 要比 cargo build 快得多,因为它跳过了生成可执行文件的步骤。如果你在编写代码的过程中不断检查你的工作,那么使用 cargo check 将加快让你知道你的项目是否仍在编译的过程!因此,许多 Rustaceans 在编写程序时都会定期运行 cargo check ,以确保程序编译成功。然后在准备使用可执行文件时运行 cargo build 。

3.3 发布release版本

        当项目最终准备发布时,可以使用 cargo build --release 对其进行优化编译。该命令将在 target/release 而不是 target/debug 下创建可执行文件。优化会让 Rust 代码运行得更快,但开启优化会延长程序的编译时间

        这就是为什么有两种不同的配置文件:一种用于开发,当你想快速、频繁地重建程序时;另一种用于编译最终的程序,你将把它交给用户,它不会被反复重建,而且会尽可能快地运行。

        如果要对代码运行时间进行基准测试,请确保运行 cargo build --release ,并使用 target/release 中的可执行文件进行基准测试

cargo build --release
   Compiling hell_cargo v0.1.0 (/home/username/rustProj/hell_cargo)
    Finished release [optimized] target(s) in 0.14s

4. 将Cargo统一作为项目的编译工具

        对于简单的项目,Cargo 并不能提供比使用 rustc 更多的价值,但当你的程序变得越来越复杂时,它将证明自己的价值。一旦程序增加到多个文件或需要依赖关系,让 Cargo 来协调构建就容易多了。

        尽管 hello_cargo 项目很简单,但它使用了你在 Rust 职业生涯中将会用到的许多真正的工具。事实上,要处理任何现有项目,你都可以使用以下命令使用 Git 查看代码,切换到项目目录并构建:

$ git clone example.org/someproject
$ cd someproject
$ cargo build

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

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

相关文章

CPU数据按行和按列读取性能差异浅析

改了一行代码,数组遍历耗时从10.3秒降到了0.5秒! 两个简单的测试程序 定义一个同样大小的二维数组,然后循环遍历,对数组元素赋值。 array1.c 对数组按行进行访问 • array2.c 对数组按列进行访问、 编译运行,并用ti…

[小程序]页面的构建

一、视图容器组件 ①View 视图区域组件&#xff0c;类似于HTML中的div&#xff0c;可以用来按块实现页面布局效果&#xff0c;具体实例如下&#xff1a; <view class"dock"><view>A</view><view>B</view><view>C</view> &…

《Linux高性能服务器编程》笔记01

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第05章 Linux网络编程基础API5.1 socket…

JOSEF约瑟 零序过流继电器LGL-110/AC AC220V 0.01~9.99A 柜内安装

LGY 、LGL零序过电压继电器 系列型号 LGY-110零序过电压继电器&#xff1b; LGL-110零序过电压继电器&#xff1b; LGL-110/AC零序过电压继电器&#xff1b; LGL-110静态零序过电流继电器 &#xff11; 应用 LGL-110 型零序过电流继电器用作线路和电力设备的零序过电流保护。…

【Arduino】无法上传程序到开发板,报错 avrdude: ser_open(): can‘t set com-state for “\\.\COM6“

问题描述 在尝试将项目上传到Arduino板子时&#xff0c;尽管开发板已被正确连接&#xff0c;并且IDE中能够正常读取到开发板信息&#xff0c;但是上传过程中仍然出现了问题。 下面是IDE中显示的开发板信息&#xff1a; 当尝试上传程序时&#xff0c;控制台报错信息如下&#…

【迅搜19】扩展(二)TNTSearch和JiebaPHP方案

扩展&#xff08;二&#xff09;TNTSearch和JiebaPHP方案 搜索引擎系列的最后一篇了。既然是最后一篇&#xff0c;那么我们也轻松一点&#xff0c;直接来看一套非常有意思的纯 PHP 实现的搜索引擎及分词方案吧。这一套方案由两个组件组成&#xff0c;一个叫 TNTSearch &#xf…

【大数据Hive】hive 行列转换使用详解

目录 一、前言 二、使用场景介绍 2.1 使用场景1 2.2 使用场景2 三、多行转多列 3.1 case when 函数 语法一 语法二 操作演示 3.2 多行转多列操作演示 四、多行转单列 4.1 concat函数 语法 4.2 concat_ws函数 语法 4.3 collect_list函数 语法 4.4 collect_set函…

获取域控的方法

在域渗透中、作为渗透测试人员&#xff0c;获取域控的权限基本上可以获取整个内网的权限 1.高权限读取本地密码 当域管理员在域成员机器上登录进行工作的时候&#xff0c;会将明文密码保存在本地进行的lsass.exe&#xff0c;可以通过 mimikatz来读取到本地的明文密码。 priv…

MySQL基础笔记(9)事务

一.简介 所谓事务&#xff0c;是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求&#xff0c;即&#xff0c;这些操作要么同时成功&#xff0c;或者同时失败——OS中有原语不可分割的概念&…

蓝桥杯、编程考级、NOC、全国青少年信息素养大赛—scratch列表考点

1、小小情报员&#xff08;202309scratch四级24题&#xff09; 1.准备工作 &#xff08;1&#xff09;选择背景 Colorful City&#xff1b; &#xff08;2&#xff09;保留角色小猫&#xff0c;选择角色Ballerina。 2.功能实现 &#xff08;1&#xff09;角色小猫初始位置…

灵活扩展:深入理解MyBatis插件机制

第1章&#xff1a;MyBatis插件的重要性 大家好&#xff0c;我是小黑&#xff0c;咱们今天要聊的是MyBatis插件&#xff0c;MyBatis&#xff0c;大家都不陌生&#xff0c;它是一个ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;让咱们在操作数据库时能更加优雅。但今…

vulnhub通关-1 DC-1(含靶场资源)

一、环境搭建 1.环境描述 描述 描述&#xff1a; DC-1 is a purposely built vulnerable lab for the purpose of gaining experience in the world of penetration testing. Dc-1是一个专门构建的易受攻击的实验室&#xff0c;目的是获得渗透测试领域的经验。 It was design…

怎么移除WordPress后台工具栏的查看站点子菜单?如何改为一级菜单?

默认情况下&#xff0c;我们在WordPress后台想要访问前端网站&#xff0c;需要将鼠标移动到左上角的站点名称&#xff0c;然后点击下拉菜单中的“查看站点”才行&#xff0c;而且还不是新窗口打开。那么有没有办法将这个“查看站点”子菜单变成一级菜单并显示在顶部管理工具栏中…

Docker进阶篇-安装MySQL主从复制

一、MySQL主服务器 1、新建主服务器容器实例3307 docker run -p 3307:3306 \--name mysql-master \--privilegedtrue \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_…

超声波清洗机清洗眼镜有用吗?值得入手洗眼镜超声波清洗机推荐

眼镜党朋友长时间佩戴眼镜避免不了受到灰尘、污垢和细菌的侵扰&#xff0c;不清洗的话我们的视线就会被有所阻碍&#xff0c;为了保证我们眼镜的干净同时也是为了注意个人卫生&#xff0c;建议我们定期清洗一下眼镜&#xff0c;给眼镜洗个澡顺便消消毒&#xff0c;从一开始用水…

多分支机构大型企业如何高效运维管理?向日葵x金地商置案例分享

对于下设多个分支机构的&#xff0c;跨地区经营的大型企业来说&#xff0c;如何高效安全的实施IT运维是一个重要的课题&#xff1b;同时&#xff0c;分支机构之间如何实现高效的异地协同办公&#xff0c;并且在这一需求的基础上进一步强化管理&#xff0c;也是企业管理者需要认…

Ubuntu 22.04 安装MySql

MySQL是非常常用的关系型数据库,无论是大厂还是小厂,都有它的身影。最大的优点是免费,安装起来也比较简单。 MySQL的架构 画了个简图,描述了下MySQL的架构。 其中的比较有趣的点在于连接池和存储引擎。连接池缓存了数据库和客户端的TCP连接,以减少建立连接的开销。存储引…

第35集《佛法修学概要》

己四 、 精进度 分三&#xff1a;庚一、 精进自性。庚 二、趣入修习精进方便。 庚三、修习精进差别内容 请大家打开讲义第九十四页&#xff0c;我们看己四&#xff0c;精进度。 当我们从人天乘一个好人的阶段提升到一种菩萨道的修学&#xff0c;我们就要注意两个重点了。在我…

实验五 PLSQL编程

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Cmake 之Android库编译

一 检测库和执行程序能否在Android上用 1.1 我们知道Cmake不止能编译Linux库程序&#xff0c;也能编译出其它系统的库&#xff0c;如windows&#xff0c;ios和android等&#xff0c;那么上一篇生成的Linux的库程序能否直接用于Android上呢&#xff0c;下面先来做个测试。 1.2…
最新文章