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


然后可以像下面这样重写之前的代码:
【十年 Python 程序员,初次尝试 Rust:“非常优秀!”】

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

文章插图
现在代码看起来很正常 。与一切从头开始相比,我更喜欢这种做法 。
我花了四五年时间才找到用 Python 编程的乐趣,所以我也愿意多花些时间来探索 Rust 的高级功能 。Rust 有许多错误处理的方法,而我喜欢更简单的方法 。
我有意略过了一些简单的概念,比如“什么是 enum?” “pub 是什么意思?” “那些#标记是什么”等,因为你只需运行一下代码就能明白它们的意思 。
一切看起来都还不错 。那么,测试方面又如何呢?
编写测试
测试应该从单元测试和集成测试两个级别上着手 。实现方法有好几种,虽然你可以把测试代码和 Rust 代码放在同一个文件中(这也是官方指南的推荐),但我还是希望用一个单独的文件夹来组织所有测试代码,这样可以减少阅读代码时的负担,也可以减少编辑文件时占用的屏幕面积 。而且说实话,在编写测试和编写代码时,我的心情是不一样的 。
方法之一如下:
十年 Python 程序员,初次尝试 Rust:“非常优秀!”

文章插图
然后可以用 cargo test 运行测试,结果如下:
十年 Python 程序员,初次尝试 Rust:“非常优秀!”

文章插图
还有许多值得展开讲的地方,但为了避免过于复杂,我们点到为止,这算是“帕累托最优”(又称80/20法则) 。这让我想起了 pytest,一个能即刻提高舒适度的工具 。
读取文件、运行一些代码并写入另一个文件
以上,我们讨论了一些最基本的问题:输出,调试,使用外部包,以及测试 。下面,我们来做一些更有效率的事情:我们可以写一个程序来处理本地文件 。下面的例子将会读取 CSV 文件,计算一些数值,然后将输出结果 。
为了实现该程序,我们需要在 Cargo.toml 中添加以下两行设置:
  • csv="1.1"
  • serde={version="1", features=["derive"]}
你可以猜猜 main 函数应该怎样写 。
十年 Python 程序员,初次尝试 Rust:“非常优秀!”

文章插图
当然,这个程序还可以实现更多功能 。如果你有一个非常复杂的 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"] }
十年 Python 程序员,初次尝试 Rust:“非常优秀!”

文章插图
该例子来自 rusqlite crate 。当然,这只是冰山一角 。但组合以上几种方法,就可以实现许多很有用的功能了 。
总结
综合考虑,Rust 是一个非常优秀的语言,有许多优秀的包,非常感谢发明这门语言并为之努力贡献的开发者们 。虽然这篇文章只是对 Rust 做了初步的探索,但我希望抛砖引玉,让初学者产生学习 Rust 的兴趣 。


推荐阅读