网易首页 > 网易号 > 正文 申请入驻

不要按照 Java 的方式编写 Rust

0
分享至

【CSDN 编者按】停止按照 Java 的方式编写 Rust,这是我发现编写 Rust 代码的乐趣。

原文链接:https://jgayfer.com/dont-write-rust-like-java

未经允许,禁止转载!

作者 | James Gayfer 译者 | 弯月

责编 | 夏萌

出品 | CSDN(ID:CSDNnews)

多年来,我一直对 Rust 很感兴趣。类型安全、内存安全并且强调正确性。谁能不爱?

我在开发 Apollo(一款 Python 应用)时遇到过很多错误,假如我使用的是 Rust,那么大多数错误都可以被 Rust 编译器捕获(虽然达不到百分百,但比例应该会很高)。一般来说,编译器可以捕获许多问题,而在使用动态语言(如 Python 或 Ruby)时,这些问题有可能进入生产环境,尽管并非所有编译器都能做到这一点。类型安全非常棒,但 Rust 十分注重正确性,这才是最吸引我的地方。

我在工作中编写了大量 Java 代码。虽然 Java 不是我最喜欢的语言,但它的编译时检查很强大。在进行重大重构时,Java 没有使用 Python 或Ruby 那么可怕。有了这样的编译器,遇到不正确或遗漏的导入语句,程序在运行时就会停止。虽然我们通常会通过测试来发现这些问题,但是将这些检查融入到语言中还是很有必要的。

然而 Java 编译器并不完美。它无法防止许多种错误,其中最令人头疼的就是空引用。在Java 中几乎所有东西都可以为 null,相关的错误直到运行时你才能发现。与之相反,Rust 拥有适当的结构来引导你处理未知值。当然,你可以选择忽略此类提示,但编译器会强制你做出深思熟虑的决定。

那么,Rust 是否比 Java 更好呢?Rust确实有许多让我很喜欢的地方。Rust 的承诺对我来说非常有吸引力。但我的 Rust 之旅并不全是阳光和彩虹。尽管 Rust 与 Java 有相似之处,但二者并不一样。直到停止按照 Java 的方式编写 Rust,我才发现了编写 Rust 代码的乐趣。

一切必须是接口

对于 Java 开发人员(我就是这样的开发人员)来说,一切都是接口,虽然这个说法不完全准确,但也有一定的道理。Java 中的接口使用起来很有趣。应用程序由小的工作单元组成,每个工作单元都不了解另一个工作单元的内部工作原理。建立这样的依赖关系树需要在前提付出不少努力,但一旦完成,就能拥有一支独立服务的大军供你使用。

然而,Rust 中没有接口,有的是特征(trait)。这些特征在很多方面与 Java 中的接口很相似。然而,我们不应该将 Rust 中的一切都写成特征。记住,Rust 的内存安全是一个很强大的功能。而代价是无法轻松“注入”实现特征的代码。

上面的代码无法编译,因为编译时无法确定 Named 的大小。为了解决这个问题,我们可以将这个特征放入Box ,这样我们就可以指向堆上动态分配的内存(称为 trait 对象)。Box 本身的大小已知,因此程序就可以编译了。

Box不太方便使用,因此我不太喜欢这种模式。我会尽可能避开它们。我们可以使用泛型来指定 特征类型。

这两种方式有何不同?初看之下结果是一样的。实际上二者的差异在于动态调度与静态调度。对于特征对象,具体的类型是在运行时解析的,而泛型的具体类型是在编译时解析的。

实际上,这意味着只要我们可以在编译时推断所有类型,就可以不使用泛型。如果直到运行时才能推断类型,则必须使用 Box。

所有权

所有权的问题依然存在。如果上述 Named 特征是应用程序中其他服务的必需依赖项,该怎么办?我们是否需要创建一个主Named ,然后将 &Named 传递给每个依赖项,这样就会引入生命周期?

还是说我们应该使用 Arc,这样依赖服务就可以写为 Arc>,从而允许并发访问所拥有的资源?

两种方法我都尝试过了,虽然可行,但都不太理想,尤其是当应用程序中的每项服务都受到影响时。

纯函数

将 Rust 当成纯粹的面向对象语言并不合适。虽然我仍然像上面的例子一样编写“服务对象”,但只在必要时使用它们,实际上我更推荐纯函数。

我们来考虑一个处理结账事件的函数,该函数会更新系统中的客户 ID。

虽然我们可以将这段处理编写为一个服务,其中的 UserRepo 是一个注入值,但上面我们已经探讨过了,这样做会带来一定的复杂性。此外,我们仍然可以轻松注入 UserRepo 的不同实现,例如提供不会访问生产数据库的实现,因此也没有理由将其编写为服务。缺点在于,我们的函数签名可能会有点“繁忙”,不过这种程度的“痛苦”根本不算什么。

拥抱真正的 Rust

以前我深陷“Rust 语言很难”的误区不能自拔。一个重要原因是我坚持按照其他语言的方式编写 Rust 代码。虽然汲取以往的经验很重要,但拥抱 Rust 本身的惯用写法对于掌握这门语言也很重要。只有转变心态才能真正掌握 Rust。按照不适合的方式编写 Rust 会让我们陷入苦苦的挣扎,我们应该拥抱它本来的样子。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
俄罗斯金融体系面临崩盘,惨烈!

俄罗斯金融体系面临崩盘,惨烈!

户外阿崭
2024-06-15 23:31:50
追梦回应克莱取关勇士:我觉得这很好笑 你们都想看有人感到受伤

追梦回应克莱取关勇士:我觉得这很好笑 你们都想看有人感到受伤

罗说NBA
2024-06-16 05:19:26
消失173天后,凯特王妃终于现身!但昨天发的近照图破绽百出,怎么回事呀?

消失173天后,凯特王妃终于现身!但昨天发的近照图破绽百出,怎么回事呀?

北美省钱快报
2024-06-16 00:17:56
瑞士峰会传来消息,好家伙,幸亏中国没去参加,普京早就布好局了

瑞士峰会传来消息,好家伙,幸亏中国没去参加,普京早就布好局了

千里持剑
2024-06-15 12:53:07
倒查30年后补税是个危险信号

倒查30年后补税是个危险信号

深度财线
2024-06-15 22:03:47
能否破格录取姜萍?浙大、港中大回应

能否破格录取姜萍?浙大、港中大回应

新民晚报
2024-06-16 09:53:22
带着家庭作业踢欧洲杯 西班牙16岁天才亚马尔首秀错失进球

带着家庭作业踢欧洲杯 西班牙16岁天才亚马尔首秀错失进球

封面新闻
2024-06-16 07:10:19
563支AI队伍和姜萍答了同一份试卷:最高34分,无一入围决赛

563支AI队伍和姜萍答了同一份试卷:最高34分,无一入围决赛

经济观察报
2024-06-15 19:56:17
突发!菲方增兵仙宾礁,中国海警船再想驱逐菲方船只,难度已大增

突发!菲方增兵仙宾礁,中国海警船再想驱逐菲方船只,难度已大增

文雅笔墨
2024-06-16 05:21:57
13年前,冲动买了10万个比特币的新东方老师,如今过得怎样了?

13年前,冲动买了10万个比特币的新东方老师,如今过得怎样了?

百年历史老号
2024-06-16 06:55:46
魔怔了?美国洛杉矶移除“禁止转弯”交通标志,因涉嫌歧视“弯的”

魔怔了?美国洛杉矶移除“禁止转弯”交通标志,因涉嫌歧视“弯的”

不掉线电波
2024-06-16 09:33:45
成都地铁被诬陷偷拍男子将直播带货

成都地铁被诬陷偷拍男子将直播带货

环球网资讯
2024-06-16 11:33:52
他们说,这才是岛内的主流民意丨湾区望海峡

他们说,这才是岛内的主流民意丨湾区望海峡

直新闻
2024-06-15 23:08:09
欧洲杯一夜2纪录!16岁巨星起飞:6秒狂奔40米,4人拦不住

欧洲杯一夜2纪录!16岁巨星起飞:6秒狂奔40米,4人拦不住

叶青足球世界
2024-06-16 02:21:19
瑞士“全球和平峰会”,必将成为文明的新起点

瑞士“全球和平峰会”,必将成为文明的新起点

近距离
2024-06-15 18:09:05
王思聪新女友曝光!年仅21岁高颜值网红,符合他的一贯审美

王思聪新女友曝光!年仅21岁高颜值网红,符合他的一贯审美

甜小娱儿
2024-06-16 10:53:48
缅北女魔头魏榕怪癖,活剥“肉灵芝”是小事,最恐怖的是“驴耳”

缅北女魔头魏榕怪癖,活剥“肉灵芝”是小事,最恐怖的是“驴耳”

马尔科故事会
2024-06-15 11:10:21
以价换量!比周边二手房便宜几千元,这个省会城市有新盘5天就售罄!销售:把房价打下来了

以价换量!比周边二手房便宜几千元,这个省会城市有新盘5天就售罄!销售:把房价打下来了

每日经济新闻
2024-06-16 08:04:07
姜萍妈妈回老家:母女开心庆贺,父亲手捧鲜花,亲戚一起大团聚

姜萍妈妈回老家:母女开心庆贺,父亲手捧鲜花,亲戚一起大团聚

素素娱乐
2024-06-16 08:19:00
刚访问中国后就捅刀子,中方非常不悦:“立即取消”!

刚访问中国后就捅刀子,中方非常不悦:“立即取消”!

占豪
2024-06-15 03:31:31
2024-06-16 13:44:49
CSDN
CSDN
成就一亿技术人
24726文章数 241820关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

上海一家三口出动去香港过周末 在高铁动卧睡一晚就到

头条要闻

上海一家三口出动去香港过周末 在高铁动卧睡一晚就到

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

房产
亲子
本地
公开课
军事航空

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

亲子要闻

陪宝宝看鲨鱼,跟海底动物们来个亲密接触,就差美人鱼了

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

公开课

近视只是视力差?小心并发症

军事要闻

普京提停火和谈条件 美防长迅速回应

无障碍浏览 进入关怀版