百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

十年 Python 程序员,初次尝试 Rust:“非常优秀!”

itomcoil 2025-01-24 12:16 18 浏览

摘要:Python 和 Rust,都是近几年深受开发者喜爱的编程语言,那么作为一个拥有十年 Python 编程经验的开发者来说,初次尝试 Rust 会有怎样的感受呢?

链接:https://karimjedda.com/carefully-exploring-rust/

声明:本文为 CSDN 翻译,未经允许禁止转载。


作者 | Karim Jedda
译者 | 弯月 责编 | 郑丽媛
出品 | CSDN(ID:CSDNnews)

最近,我找到了一份新工作,公司最常用的编程语言之一是 Rust。

在此之前,我使用 Python 长达十年之久,主要是做数据工程的工作。但如今,我打算尝试一下这种新的(对我来说)编程语言。我经常在不同平台上看到各类夸赞 Rust 的文章,我想看看 Rust 是否真的不负盛名。

Rust 与 Python 有很大的不同,因此我不打算在本文中详细说明 Rust 的独特之处。作为初学者,我只希望尽快上手,希望能以最短的过渡,尽快 Rust 完成工作,同时也希望评估一下我自己的学习能力。

从某种程度上来说,我更感兴趣的是 Rust 整体的使用体验,而不是具体的功能列表。


设置开发环境


设置开发环境非常简单,只需参照 Rust 网站提供的示例,在终端中运行一个命令就可以了。

当你认为一切都已安装并配置妥当,此时如果想验证 Rust 是否已正确安装,只需在空目录中创建一个空项目:

cargo new tutorialcd tutorialcargo run

接下来,在文本编辑器中打开该文件夹。如果你是新手,我推荐 VSCode,因为其中的一些扩展很有帮助,关于如何使用这些扩展的指南也很容易入手。我推荐 rust-analyzer 作为 VSCode 的唯一扩展。


输出与调试

如果想了解程序是如何运行的,首先要做的就是通过命令行来了解程序在干什么,以及完成了什么。

此外,你还可以使用常规调试器。在 M1 上,我推荐在 Visual Studio Code 中使用 LLDB,它不仅工作良好,通常还要比在输出结果中打印日志更为方便。

到这里为止,Rust 与 Python 其实都非常相似,只不过所有命令都是通过 cargo run 运行的,而不是调用特定文件,如 python3 somefile.py。

另外,你也可以先运行 cargo build,然后运行 target/debug/tutorial 中的文件,得到的结果是相同的。接下来,如果将生成的文件复制到另一个位置或另一台类似的机器上,也可以正常工作,且无需安装任何与 Rust 相关的东西。


错误处理


不得不承认,编程中总会遇到一些意外,能够以可预测的方式处理这些意外非常重要。编程中的一大挑战就是很难考虑到程序中所有可能出现的错误,因为只要写代码就可能会出错。

“每个人都知道调试比编写程序要难一倍。所以,如果你在代码编写代码时就用尽了聪明才智,又如何调试呢?”

—— Brian W. Kernighan

在 Python 中,通常我们通过 try/except 方法来抛异常,并完成错误处理。我们运行一段代码,如果出错,则通过条件来捕捉异常,如果所有条件都不匹配,则将其放入一个通用的异常中。异常有各种不同的类别,Python 允许你在包中调用不存在的函数,并在运行时产生异常,但在 Rust 中这样做甚至无法通过编译——Rust 不允许在运行时出现任何奇怪的错误,从而消除了一大类不太容易预测的错误。

下面通过一个例子来说明 Rust 的这种方法,同时我会用 Python 的术语进行解释。

在上面的代码中,我们创建了一个自定义的异常,在 do_something 函数中抛出,而 main 函数会检查该异常。上面的代码跟 try/exept 基本上一样,只不过多了一些样板代码这些样板代码是必须的,但以我现在的水平有点难以理解

你也许会说“肯定有更好的办法”,特别是如果你有很多 Python 经验的话,的确如此,我们将不得不使用包。。


使用外部包


与其他行业相比,编程的最大优势就是可以使用别人构建的东西。如果你计划在程序中进行错误处理,那么有一个很好用的包 thiserror。Rust 的包管理器是 cargo。

Rust 中的包叫做 crate。安装方法为编辑目录下的 Cargo.toml 文件。在本例中,我们在 [dependencies] 后面添加 thiserror = "1.0" 就可以了。

然后可以像下面这样重写之前的代码:

现在代码看起来很正常。与一切从头开始相比,我更喜欢这种做法。

我花了四五年时间才找到用 Python 编程的乐趣,所以我也愿意多花些时间来探索 Rust 的高级功能。Rust 有许多错误处理的方法,而我喜欢更简单的方法。

我有意略过了一些简单的概念,比如“什么是 enum?” “pub 是什么意思?” “那些#标记是什么”等,因为你只需运行一下代码就能明白它们的意思。

一切看起来都还不错。那么,测试方面又如何呢?


编写测试


测试应该从单元测试和集成测试两个级别上着手。实现方法有好几种,虽然你可以把测试代码和 Rust 代码放在同一个文件中(这也是官方指南的推荐),但我还是希望用一个单独的文件夹来组织所有测试代码,这样可以减少阅读代码时的负担,也可以减少编辑文件时占用的屏幕面积。而且说实话,在编写测试和编写代码时,我的心情是不一样的。

方法之一如下:

然后可以用 cargo test 运行测试,结果如下:

还有许多值得展开讲的地方,但为了避免过于复杂,我们点到为止,这算是“帕累托最优”(又称80/20法则)。这让我想起了 pytest,一个能即刻提高舒适度的工具。


读取文件、运行一些代码并写入另一个文件


以上,我们讨论了一些最基本的问题:输出,调试,使用外部包,以及测试。下面,我们来做一些更有效率的事情:我们可以写一个程序来处理本地文件。下面的例子将会读取 CSV 文件,计算一些数值,然后将输出结果。

为了实现该程序,我们需要在 Cargo.toml 中添加以下两行设置:

  • csv="1.1"

  • serde={version="1", features=["derive"]}

你可以猜猜 main() 函数应该怎样写。

当然,这个程序还可以实现更多功能。如果你有一个非常复杂的 CSV 文件,则可以在 Rust 中调用 pandsa(pola.rs)来处理数据。我还需要进一步研究,不过似乎这种处理方法非常强大且高效

我认为,与 Python 相比,Rust的 CSV 处理能力不相上下,除了它能自动反序列化之外。

最后,我们还可以添加一些测试,此处不再赘述。


发送 HTTP 请求


下面,我们来尝试发送基本的 HTTP 请求并处理结果。现在的绝大多数请求都需要处理 JSON。

在 Cargo.toml 中添加如下几行代码:

reqwest = { version = "0.11", features = ["json"] }tokio = { version = "1", features = ["full"]}serde_json = "1"

这样就可以了,现在可以从 API 请求数据了。结合使用上面两个方法,我们可以获取数据,用 pola.rs 进行分析,然后将结果写入 CSV 文件中,同时保证内存安全。还记得 Python 需要循环才能实现这一点吗?在这方面 Rust 做得很好。

我相信,Rust 的生态系统会越来越大,以覆盖更多的用例,以后利用已有的 crate 实现这一切会易如反掌。


使用 SQLite


虽然在这篇文章中提到 SQLite 似乎有些奇怪,但我开发过的程序经常用到 SQLite。我很喜欢 SQLite,因为它是可移植的,非常有效,而且不需要任何维护。

用 Python 操作 SQLite 的问题永远是要不要使用 ORM。请不要误会,SQLAlchemy 非常优秀,但在进行非常小的操作时,用它就像杀鸡用牛刀了。而且 SQLAlchemy 带来的复杂性使它不适合小型嵌入式设备。

反之, Rust 可以在这方面大放异彩,网上有很多如何利用Rust操作 SQLite 的例子,我认为都非常不错。

举个简单的例子,别忘了在 Cargo.toml 中添加下面这行代码:

rusqlite = { version = "0.28.0", features = ["bundled"] }

该例子来自 rusqlite crate。当然,这只是冰山一角。但组合以上几种方法,就可以实现许多很有用的功能了。


总结


综合考虑,Rust 是一个非常优秀的语言,有许多优秀的包,非常感谢发明这门语言并为之努力贡献的开发者们。虽然这篇文章只是对 Rust 做了初步的探索,但我希望抛砖引玉,让初学者产生学习 Rust 的兴趣。

初次使用某种编程语言时,重点在于弄清楚语言本身能实现哪些功能,而不是背诵一篇完整的术语表。你不需要去理解 borrowing、继承或 traits 的具体含义,而应该跟随些入门文章按部就班地做一遍。

从无到有的难度远大于从一到十。

相关推荐

Excel新函数TEXTSPLIT太强大了,轻松搞定数据拆分!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!最近我把WPS软件升级到了版本号:12.1.0.15990的最新版本,最版本已经支持文本拆分函数TEXTSPLIT了,并...

Excel超强数据拆分函数TEXTSPLIT,从入门到精通!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!今天跟大家分享的是Excel超强数据拆分函数TEXTSPLIT,带你从入门到精通!TEXTSPLIT函数真是太强大了,轻松...

看完就会用的C++17特性总结(c++11常用新特性)

作者:taoklin,腾讯WXG后台开发一、简单特性1.namespace嵌套C++17使我们可以更加简洁使用命名空间:2.std::variant升级版的C语言Union在C++17之前,通...

plsql字符串分割浅谈(plsql字符集设置)

工作之中遇到的小问题,在此抛出问题,并给出解决方法。一方面是为了给自己留下深刻印象,另一方面给遇到相似问题的同学一个解决思路。如若其中有写的不好或者不对的地方也请不加不吝赐教,集思广益,共同进步。遇到...

javascript如何分割字符串(javascript切割字符串)

javascript如何分割字符串在JavaScript中,您可以使用字符串的`split()`方法来将一个字符串分割成一个数组。`split()`方法接收一个参数,这个参数指定了分割字符串的方式。如...

TextSplit函数的使用方法(入门+进阶+高级共八种用法10个公式)

在Excel和WPS新增的几十个函数中,如果按实用性+功能性排名,textsplit排第二,无函数敢排第一。因为它不仅使用简单,而且解决了以前用超复杂公式才能搞定的难题。今天小编用10个公式,让你彻底...

Python字符串split()方法使用技巧

在Python中,字符串操作可谓是基础且关键的技能,而今天咱们要重点攻克的“堡垒”——split()方法,它能将看似浑然一体的字符串,按照我们的需求进行拆分,极大地便利了数据处理与文本解析工作。基本语...

go语言中字符串常用的系统函数(golang 字符串)

最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...

无规律文本拆分,这些函数你得会(没有分隔符没规律数据拆分)

今天文章来源于表格学员训练营群内答疑,混合文本拆分。其实拆分不难,只要规则明确就好办。就怕规则不清晰,或者规则太多。那真是,Oh,mygod.如上图所示进行拆分,文字表达实在是有点难,所以小熊变身灵...

Python之文本解析:字符串格式化的逆操作?

引言前面的文章中,提到了关于Python中字符串中的相关操作,更多地涉及到了字符串的格式化,有些地方也称为字符串插值操作,本质上,就是把多个字符串拼接在一起,以固定的格式呈现。关于字符串的操作,其实还...

忘记【分列】吧,TEXTSPLIT拆分文本好用100倍

函数TEXTSPLIT的作用是:按分隔符将字符串拆分为行或列。仅ExcelM365版本可用。基本应用将A2单元格内容按逗号拆分。=TEXTSPLIT(A2,",")第二参数设置为逗号...

Excel365版本新函数TEXTSPLIT,专攻文本拆分

Excel中字符串的处理,拆分和合并是比较常见的需求。合并,当前最好用的函数非TEXTJOIN不可。拆分,Office365于2022年3月更新了一个专业函数:TEXTSPLIT语法参数:【...

站长在线Python精讲使用正则表达式的split()方法分割字符串详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用正则表达式的split()方法分割字符串详解》。使用正则表达式分割字符串在Python中使用正则表达式的split(...

Java中字符串分割的方法(java字符串切割方法)

技术背景在Java编程中,经常需要对字符串进行分割操作,例如将一个包含多个信息的字符串按照特定的分隔符拆分成多个子字符串。常见的应用场景包括解析CSV文件、处理网络请求参数等。实现步骤1.使用Str...

因为一个函数strtok踩坑,我被老工程师无情嘲笑了

在用C/C++实现字符串切割中,strtok函数经常用到,其主要作用是按照给定的字符集分隔字符串,并返回各子字符串。但是实际上,可不止有strtok(),还有strtok、strtok_s、strto...