您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 百科

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

时间:2022-11-23 16:24:04  来源:CSDN  作者:

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

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

作者 | Karim Jedda

译者 | 弯月 责编 | 郑丽媛

出品 | CSDN(ID:CSDNnews)

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

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

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

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

设置开发环境

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

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

  •  
  •  
  •  
cargonew tutorial cdtutorial cargorun

接下来,在文本编辑器中打开该文件夹。如果你是新手,我推荐 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 的具体含义,而应该跟随些入门文章按部就班地做一遍。

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



Tags: Rust   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
在 Rust 编程中使用泛型
本文的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。1.摘要Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以...【详细内容】
2024-01-09  Search: Rust  点击:(89)  评论:(0)  加入收藏
在 Rust 编程中使用多线程
编程语言有一些不同的方法来实现线程,而且很多操作系统提供了创建新线程的 API。Rust 标准库使用 1:1 线程实现,这代表程序的每一个语言级线程使用一个系统线程。1. Rust线程...【详细内容】
2024-01-07  Search: Rust  点击:(78)  评论:(0)  加入收藏
为什么要学一学 Rust?
来源 | 泡芙玩编程(ID:gh_23284b66d001)前言Rust 可能有点难学,但我还是建议去学一学,起码要了解一下它的理念,它是如何做到它所吹的那些特性的,为什么别的语言做不到它做到了,通过...【详细内容】
2023-12-29  Search: Rust  点击:(93)  评论:(0)  加入收藏
你应该知晓的 Rust Web 框架
前言在之前的用 Rust 搭建 React Server Components 的 Web 服务器我们利用了Axum构建了RSC的服务器。也算是用Rust在构建Web服务上的小试牛刀。虽然说Axum在Rust Web应用中...【详细内容】
2023-12-07  Search: Rust  点击:(165)  评论:(0)  加入收藏
解密 Python 如何调用 Rust 编译生成的动态链接库
楔子Rust 让 Python 更加伟大,随着 Rust 的流行,反而让 Python 的生产力提高了不少。因为有越来越多的 Python 工具,都选择了 Rust 进行开发,并且性能也优于同类型的其它工具。...【详细内容】
2023-11-29  Search: Rust  点击:(191)  评论:(0)  加入收藏
一篇学会 Rust 内存布局
整型,浮点型,struct,vec!,enum 本文是对 Rust内存布局[1] 的学习与记录 struct A { a: i64, b: u64,}struct B { a: i32, b: u64,}struct C { a: i64, b:...【详细内容】
2023-11-28  Search: Rust  点击:(114)  评论:(0)  加入收藏
Go vs Rust:文件上传性能比较
一、设置所有测试都在配备16G内存的 MacBook Pro M1 上执行。软件版本为: Go v1.20.5 Rust v1.70.0测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能够发送多部分请...【详细内容】
2023-11-20  Search: Rust  点击:(174)  评论:(0)  加入收藏
不要按照 Java 的方式编写 Rust
【CSDN 编者按】停止按照 Java 的方式编写 Rust,这是我发现编写 Rust 代码的乐趣。原文链接:https://jgayfer.com/dont-write-rust-like-java作者 | James Gayfer译者| 弯月责...【详细内容】
2023-10-13  Search: Rust  点击:(217)  评论:(0)  加入收藏
谷歌宣布正使用 Rust 语言重写 Android 安全关键组件
IT之家 10 月 10 日消息,谷歌在去年声称正在将 Android 原生代码从 C++ 迁移到 Rust,目前谷歌在博客中发布文章,展示了当前使用 Rust 语言的新进展。据悉,谷歌正在使用 Rust 语...【详细内容】
2023-10-11  Search: Rust  点击:(263)  评论:(0)  加入收藏
Jetbrains 发布全新 Rust IDE 命名 RustRover
IT之家 9 月 14 日消息,JetBrains 日前宣布推出一款独立的 Rust IDE,产品名称为 RustRover。Jetbrains 多年来一直以插件的形式在 IntelliJ IDEA 和 CLion 中支持 Rust 功能,随...【详细内容】
2023-09-14  Search: Rust  点击:(293)  评论:(0)  加入收藏
▌简易百科推荐
用于人工智能开发的主流编程语言都有哪些?
在人工智能开发领域,编程语言的选择至关重要。目前,主流的编程语言主要包括Python、Java、C++、JavaScript和Swift等。这些语言各具特色,适用于不同的人工智能开发场景。首先,Py...【详细内容】
2024-01-31    简易百科  Tags:编程语言   点击:(133)  评论:(0)  加入收藏
探究微处理器开发中的汇编语言的优势与挑战
在计算机编程中,汇编语言是一种低级语言,它可以直接控制计算机的硬件资源。与高级语言相比,汇编语言具有更高的运行效率和更好的控制能力,但同时也更加复杂和难以理解和维护。在...【详细内容】
2023-12-19  松鼠宝贝    Tags:汇编语言   点击:(100)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  爱发白日梦的后端  微信公众号  Tags:编程语言   点击:(178)  评论:(0)  加入收藏
编程语言大比拼:Python、Java、C、C++、Go 实现 'Hello World' 和九九乘法表"
应该90%的IT专业的朋友写的第一段代码就是打印"holle world",每个大学老师都会通过这个方式吸引你对课程产生兴趣。也许有的朋友学的是JAVA开发,有的学的是c,在几年前应该很...【详细内容】
2023-12-11  IT仔的笔记本  微信公众号  Tags:编程语言   点击:(217)  评论:(0)  加入收藏
TypeScript中的null和undefined的区别
在TypeScript中,null和undefined是两个特殊的值,用于表示变量的缺失或未定义。尽管它们在某些情况下可能看起来相似,并且都可以表示"没有值",但它们在语义和用法上存在一些重要...【详细内容】
2023-12-07  科学随想录  微信公众号  Tags:TypeScript   点击:(136)  评论:(0)  加入收藏
面向AI开发的六种最重要的编程语言
作者丨FATIH KÜÇÜKKARAKURT 译者 | 布加迪审校 | 重楼出品 | 51CTO技术栈(微信号:blog51cto)在AI开发界,你使用的编程语言很重要。每种语言有其独特...【详细内容】
2023-12-07    51CTO  Tags:编程语言   点击:(121)  评论:(0)  加入收藏
NLP问题实战:基于LSTM(RNN)和Transformer模型
译者 | 朱先忠审校 | 重楼简介GPT等语言模型最近变得非常流行,并被应用于各种文本生成任务,例如在ChatGPT或其他会话人工智能系统中。通常,这些语言模型规模巨大,经常使用超过数...【详细内容】
2023-11-29    51CTO  Tags:NLP   点击:(274)  评论:(0)  加入收藏
一文了解低级和高级编程语言
中文是一种尽量用简短文字表达更多含义的语言,所以很多时候一句话的含义很容易曲解成别的意思。最近,有人提出C语言是一种中级语言的概念,所以特意介绍一下低级语言和高级语言...【详细内容】
2023-11-23  数字随行  微信公众号  Tags:编程语言   点击:(232)  评论:(0)  加入收藏
JetBrains 发布 2023 调研报告:77% 开发者使用 ChatGPT
IT之家 11 月 21 日消息,JetBrains 日前公布了《2023 开发人员生态系统现状》调研报告,汇集了来自全球 26,348 位开发者的调研结果。《开发者生态系统现状报告》涵盖广泛的主...【详细内容】
2023-11-21    IT之家  Tags:JetBrains   点击:(239)  评论:(0)  加入收藏
Go vs Rust:文件上传性能比较
一、设置所有测试都在配备16G内存的 MacBook Pro M1 上执行。软件版本为: Go v1.20.5 Rust v1.70.0测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能够发送多部分请...【详细内容】
2023-11-20  技术的游戏  微信公众号  Tags:Rust   点击:(174)  评论:(0)  加入收藏
站内最新
站内热门
站内头条