rust语言初识

程序设计实践课上水一篇ing

来源:rust基础入门-1.初识rust-酷程网 (kucoding.com)

rust作为一名新兴语言,与go又有些许不同,因为它的目标是对标系统级开发,也就是C、C++这两位在编程界的位置。比如我们最常用的windows系统,就是用C/C++语言开发的,也正因如此,我们才能用C++在VS中非常方便的调用win API函数。

涉及到底层,需要控制的细节就会越多,rust试图通过简便语法便利包管理安全可靠等良好特性脱颖而出。

目前rust语言最大的缺点是生态还不够完善。

比如当你想要用rust写GUI程序,就很麻烦,因为官方目前还没有推出GUI库,但这并非是无法解决的,rust同样意识到了这个问题,所以它提供了简便的方式让你可以直接在代码中调用C语言开发的库。

这意味着只要是用C语言开发的库,你就能用rust语言调用它进行开发。

比如你可以使用rust绑定C开发的FLTK、GTK等GUI库就可以进行开发GUI程序了,当然也有正在发展的库,比如egui、iced、tauri等等。个人目前最推荐的是Tauri,前提需要会web前端:初识Tauri。

而rust带来的代码安全、便捷的开发又是C语言所无法比拟的,随着Rust生态的不断完善,会取代很大一部分C/C++的份额,不过想要彻底将C/C++取代段时间来看还是有点不现实的,比如windowslinuxmac三大操作系统以及各种C/C++开源库的代码量巨大。

先学C/C++语言,再来学rust:初识C++。

Rust简介

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

主要有以下几点:

  • 内存安全

Rust 中的所有内存访问都经过了编译器的严格检查,并且在运行时不会出现空指针异常或数据竞争等问题。这意味着 Rust代码具有更高的可靠性和安全性,可以避免常见的安全漏洞。而C语言则时常需要担心指针、内存问题,尤其是在大型项目中,非常容易因此出现各种各样的Bug。

  • 高效性能

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

  • 并发性

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

  • 社区支持

Rust拥有活跃的社区,在crates上提供了许多开源库、工具和框架,可以大幅度提升开发效率。

C/C++虽然学习的人很多,但却几乎没有官方的、活跃的社区可以供大家交流,都是在各搞各的。

  • 统一包管理

C/C++中,最让人诟病的便是包管理了,想要用一个包,还需要自己下载、安装、配置等等。

而Rust则直接提供了一个统一的包管理程序,只需要写一行代码,就能自动为你下载配置好你所需要的一切,并且还提供对应的文档,使用起来非常方便!

综上,能看出Rust的优势。

Python有一个统一的包管理程序pip,可以很方便的下载各种第三方包,而不需要像C++那样自己配置。而一旦学会了Rust,即使是作为较为底层的开发人员,我们同样也能享受到这种便利了。

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

也无法使用。

安装Rust编译器

与C/C++一样,Rust也是一门编译型语言,也就是说,Rust的代码必须要先编译成为二进制程序之后才能运行。比如window系统中我们最常看到的.exe二进制可执行程序。

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

一般在浏览器中直接搜索Rust,出现的第一个就是Rust的官网了,不过我这里也还是放一下它的官网地址,可以直接点击查看:Rust

然后点击“马上开始”:

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

下载后,点击运行这个程序,等待其安装完毕。

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

安装完成后,进入控制台运行命令:cargo --version

能打印出版本则说明安装成功了,不会进入控制台的可以参考文章:程序员必懂的常识

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

这一点可以看官网说明:

简单来说就是Cargo是Rust语言的包管理软件,后面我们开发Rust时,使用的也基本都是这个命令。

第一个Rust程序

 基础语法:http://t.csdnimg.cn/9ronF

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

比如运行cargo new hello-world

然后它就会为我们在当前目录中生成一个项目文件夹:

这里简单对其介绍一下:

  • .git:这是一个隐藏文件夹,用于git软件实现版本管理,学习rust期间一般用不着,不用管。

  • src:这是存放代码的地方,以后我们写的rust代码就放在这个文件夹里面。

  • .gitignore:这同样是git使用的,用于忽略哪些类型文件,不进行版本管理,一般同样不用管

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

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

用记事本打开Cargo.toml,就能看到下面这样的内容:

对于你想要用到的库,直接写在[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!字符串。

rust一上来就给我们生成了这么多文件,发现rust这样做的好处,在后面开发项目时。

前面我们说了,rust是一个编译型的语言,所以会编译成二进制后次才能运行,我们可以在下面的目录中找到这个生成的exe程序:

不过直接点击它运行是不行的,因为前面的代码中我们只写了一个打印字符串的代码,打印完程序就结束了,所以你只能看到一个黑影闪过,后面我们会想办法解决这个问题。

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

可如果我只想编译,不运行

使用命令cargo build,其默认构建的是Debug版本,即可调试版本

直观的来说就是生成的exe程序会稍微比较大。

也可以构建Release版本,使用命令:cargo build --release

这个命令生成的可执行文件会较小:

如果你还是觉得它比较大,那么我们还可以使用一些工具来进一步压缩它,可以让它只有几十kb

 IDE环境

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

个人推荐VSCode这款编辑器,它也是目前最受欢迎的一个编辑器。

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

可以选择自己合适的版本下载安装即可,上图箭头指示的是我安装的版本:x64 系统安装

但其实各个版本区别不大。

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

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

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

而后面紧跟的 .,指代的就是当前目录,意思就是用VScode打开当前目录,目录相关介绍可以参考文章:路径详解

然后你就能看到这个rust项目项目文件夹在VSCode中被打开了:

但VScode只是一个编辑器,所以我们还需要安装rust插件,来打造这个编辑器成为一个IDE,方法也很简单。

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

这样就完成了rust的开发环境的配置,现在当你输出前几个字符时,就会自动弹出代码提示:

这时,你只需要按Enter键就可以自动帮你填充代码。

并且运行代码的方式也变简单了,只需要点击main函数上面的按钮,就可以直接运行:

同时你也可以直接点击Debug进入调试状态:

不会调试的可以参考文章:调试。

初识包管理

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

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

这里就用到了ferris-says这个库,首先来到前面提到的Cargo.toml文件,然后在[dependencies]项添加一下这个库:

后面的数字是这个库的版本号,Ctrl+S保存后,vscode就会自动给我们拉取这个库包到本地。

你可能也注意到了不知道什么时候,项目文件夹中多了一个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 https://www.kucoding.com");let width = message.chars().count();let mut writer = BufWriter::new(stdout.lock());say(message.as_bytes(), width, &mut writer).unwrap();
}

这一小段代码就涉及到了rust中相当多的概念,先不看这段代码的逻辑,你可以自己随意更改这段代码里面的字符串:"Hello https://www.kucoding.com"

然后运行上面这段代码,就能在终端看到输出的图案了。

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

至于库代码上层的这个文件夹,则是代表着仓库名,你的可能是github之类的,这个不一定相同。

以下几个命令需要记忆:

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

逆向基础:http://t.csdnimg.cn/Xi0IC

rust逆向:http://t.csdnimg.cn/kXH0J

以及一系列文章

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

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

相关文章

001.数据分析_NumPy

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf

联想笔记本 y9000p创建python工程: 使用langchain支持openai的向量化embedding安装软件包 发现没有openai ,添加软件仓库打开工具窗口 点击设置

Jlink卡死 JFlash keil 盗版JLINK

现象:用Keil打开Jlink配置页,会卡死。 解决方法:用旧版本的Jlink软件,因为淘宝买的很多JLINK下载器是盗版的,不支持新版本的JLINK软件。到https://www.segger.com/downloads/jlink下载旧版本的软件。 如果必须要用新版…

SQLI-labs-第二十五关和第二十五a关

目录 第二十五关 1、判断注入点 2、判断数据库 3、判断表名 4、判断字段名 5、获取数据库的数据 第二十五a关 1、判断注入点 2、判断数据库 第二十五关 知识点:绕过and、or过滤 思路: 通过分析源码和页面,我们可以知道对and和or 进…

链表经典题目—相交链表和链表倒数第k个节点

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C和数据结构怀有无限热忱的探索者。🙌 🌸🌸🌸这里是我分享C/C编程、数据结构应用的乐园✨ 🎈🎈&…

艾体宝干货 | 教程:使用ntopng和nProbe监控网络流量

本教程旨在分享如何通过 ntopng 和 nProbe 这两款工具,深入了解和掌握网络流量监控的艺术。我们将提供从基本概念到高级应用的全面指导,涵盖了在多种平台和设备上的部署和配置步骤。不论您是专业人员还是技术爱好者,跟随本教程,都…

11thingsboard物联网网关接入ThingsBoard物联网平台的操作说明

本文包含关于如何配置ThingsBoard 平台和连接钡铼技术R40设备的说明。ThingsBoard平台是一个用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准MQTT协议实现设备连接。ThingsBoard结合了可扩展性、容错性和性能,因此您永远不会丢失数据。 4G L…

【考研数学】线代除了「李永乐」,还能跟谁?

考研线代,除了利用了老师,我觉得还有一个宝藏老师的课程值得听! 那就是喻老,这个是我在b站上面新发现的老师,听完他的课程发现真的喜欢 他不仅在B站上开设了课程,还编写了配套的线性代数辅导讲义&#xff…

Python中的SSH、SFTP和FTP操作详解

大家好,在网络编程中,安全地连接到远程服务器并执行操作是一项常见任务。Python 提供了多种库来实现这一目标,其中 Paramiko 是一个功能强大的工具,可以轻松地在 Python 中执行 SSH、SFTP 和 FTP 操作。本文将介绍如何使用 Parami…

企业选择定制化MES管理系统时需要考虑的核心功能

在当今制造业的数字化转型浪潮中,企业对于实现生产现场透明管理的需求愈发迫切。为了满足这一需求,MES管理系统成为了众多企业的首选解决方案。MES管理系统以其高度的灵活性和可定制性,能够根据不同行业的特性,为企业提供量身定制…

看潮成长日程表用户手册(上)

看潮成长日程表用户手册(上) 一、特色功能1、以每周日程表为主要形式2、全时管控的时间管理3、持续的日程管理4、分期间时间表5、按日排程,按周输出6、夏季作息时间处理7、年度假日处理8、休息日处理9、弹性日程10、完成记录11、多种输出形式…

重构与优化-前言

关注公众号畅读:IT技术馆 Java代码重构是优化现有代码结构、提升代码可读性、可维护性和性能的过程,而不会改变其外在行为。这包括命名规范、消除重复代码、改进设计模式的使用、优化数据结构和算法等。下面是一些常见的Java代码重构技巧及示例: 1. 重命名(Rename) 目的…

光纤跳线组成结构划分你知道吗

按照组成结构划分 光纤跳线根据组成结构的不同可分为带状光纤跳线和束状光纤跳线。带状光纤跳线使用的是由光纤带组成的带状光缆,大多呈扁平形状,因具有较高的光纤密度,它可以容纳更多的纤芯,因此大大节省布线成本和空间&#xf…

猫咪掉毛严重怎么办?小米、希喂、霍尼韦尔宠物空气净化器测评

吸猫成瘾,养猫“致贫”?在当今社会,养猫已成为众多年轻人的一个追捧的事情。乖巧又可爱,下班回到家撸一把猫已经成为年轻人的日常。但是猫咪可爱也不影响它的各种养猫伴生的问题!无论是漂浮的浮毛、飘散的皮屑还是偶发…

2024年上半年系统架构设计师真题-复原程度90%

前言 此次考试监考特别严格,草稿纸不允许带出考场,并且准考证上不允许任何写画,甚至连笔都允许带一支,所以下面的相关题目都是参考一些群友的提供,加上自己的记忆回顾,得到的结果。 其中综合知识部分的题…

1.int 与 Integer 的简单区别

蓝桥杯刷题从此开始: 第一题就是两个数的和,个人看来主要考察 int与integer 的区别; 这是我提交的答案,竟然会报错: import java.util.*; //输入A、B,输出AB。 class add {public static void main(String …

yolov10 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

特别说明:参考官方开源的yolov10代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 yolov8、v9还没玩热乎,这不yolov10又来了,那么…

tomcat--安全配置多虚拟机

端口8005/tcp 安全配置管理 8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,tomcat接收到后就会关闭此Server。此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成…

Java进阶学习笔记26——包装类

包装类: 包装类就是把基本类型的数据包装成对象。 看下API文档: deprecated:极力反对、不赞成的意思。 marked for removal:标识为去除的意思。 自动装箱:基本数据类型可以自动转换成包装类。 自动拆箱:…

前端怎么使用svg格式的图片

目录 第一步,找到图标 第二步,使用 第一种,SVG下载 第二种,粘贴SVG代码 第一步,找到图标 以阿里巴巴矢量图标库为例,随便找一个图标,如下图 第二步,使用 第一种,SV…