从javascript透视中生锈

2021-06-13 00:40:54

使用Rust为写小工具,我一直在很开心。我的日常工作涉及大量的JavaScript和Rust提供了一种熟悉的感觉,因此尝试锈病是一个容易做出的决定。但与此同时,实际上在Rust中做了有意义的工作需要很多重新思考如何构建与您的代码有关的结构和原因。编译器 - 符合其呼叫 - 是无情的;然而,出于某种原因,它出现了很多乐趣,修补你的代码来使它成为它 - 最后! - 编译。

在这篇文章中,我记录了 - 尽管有点有趣的方式 - 从迄今为止的锈土地旅程中的一些想法,从铁杆javascript爱好者的角度来看。

现代生锈*出现*非常类似于现代JavaScript。你用Let宣布变量,你的函数看起来很相似,类型不是一个陌生人,因为打字签字,有异步/等待和整体它挖掘出熟悉感。

不幸的是,好消息部分结束了很快。问题的核心不是语法,而是程序内部的锈迹的方式。在高级别语言中,您可以获得从计算机工作方式屏蔽您的Cushy抽象。这是完美的意义;如果您的目标是通勤到您的工作场所,您只需要知道如何驾驶汽车 - 您不必摆弄其内燃机的内部结构。相比之下,在低级语言上,您可以获得螺栓和螺钉,您必须成为汽车机制来开车到杂货店。

每种方法都有自己的优缺点;因此,它们主要用于不同的问题域。铁锈旨在坐在中间。它可以访问所有原始设施,同时还提供高级抽象的速度和易于高层抽象。但是 - 并且总是那么 - 它需要你,开发人员,为此付出代价:您必须学习一种新的推理方式对您的计划。

计算机程序依赖于内存中的读写值。没有办法,就像没有成分的没有办法就没有办法。因此,不知何故,我们必须采购成分,将它们切成正确的数量,按照正确的顺序将它们扔进锅中,最终在我们完成后照顾厨房里的混乱。

高级语言就像亲爱的父母一样。他们在那里耐心地清理你,这样你就可以表演你的......没有让你的手脏的艺术。谨然,他们为您提供一个漂亮的&有用的Sancho Panza - 充满了称为“垃圾收集器” - 对于您的一些攻击性的备用备用备份时,请备受一些备份。

当它归结为内存管理时,Rust就像“Meh - 真正的厨师清理自己的垃圾”。并且有很好的理由,因为垃圾收集器附带自己的一组可能会伤害你,当你最不期望它。虽然在同一时间,RUTR从其他语言的经验中汲取了过去的经验,并接受迫使程序员进行内存管理,作为调试Douglas Adams写下“Starship Titanic”。

为了绕过人类和太精致的换气,铁锈提出了一个新的计划。它可以总结为“我们现在都是衬布”。

......所以如此说莎士比亚。然而,那些......不是那么甜味的味道吗?这句话是否适合否定案例?考虑到人类使用委婉语的漫长传统,我们可以相对肯定是不是那么。

Rust乐意地从事纪念令人愉快的误导艺术。其文学中的突出是“所有权”的概念。然而,在锈病中,“所有权”对所有者没有大的利益。相反,“所有权”意味着一些相对的相对传递给你债务;现在你拥有这个债务。而且 - 没有错误 - 这里没有违约。

在Rust的Westeros大陆(敢说,威斯特堡?),有小小的,小而大而巨大的救济。这里的扭曲是每个围场都被林纳斯占据。 eiefs在内部做自己的东西,当他们需要从外面的“商品”时,他们将产生债务以获得所述货物。最终,债务必须偿还给威斯特罗众神。 Rust是这个世界的Draconian女王 - 它将监督高度从高度的一切,以确保众神得到他们的会费。

在锈,每个范围都是自己的封面。从系统中采购并在范围内使用的变量(内存)保持 - 类似VEGAS中的秘密 - 仅在该范围内。如果完成范围并且不再用于目的,则存储器返回到系统。编译器确保它是因为它透明地注入了正确的封口中的代码,这完全正确。所以你的范围是不可能逃避他们的命运。这是铁锈的铁规则(因为讽刺的水平欢呼)。

我们这里有2个范围。来自主要的外部和明确的内部一个用于演示。 FRISS所有权在这里有效:

A想要与内在范围合作,因此主要转移A对内在范围的所有权 请注意,所有权的债务被偿还给系统,而不是它起源于它的范围。 A的所有权不会恢复到主范围。 在这里,主要范围想要再次使用,但我们表示,当内在范围结束时,锈病已经丢弃了。 程序达到执行点时是否不会崩溃并燃烧? 是的,它会的。 但随着斯巴达人回应亚历山大的父亲,马其顿的菲利普国王二世:如果它达到这一点。 Rust编译器是法律主义传统的骄傲门徒,所以韩飞慈会慷慨地禁止所有其他语言。 除非编译器将其批准盖章,否则在锈的土地中没有任何事情发生。 编译器将彻底检查一切,并评估程序是否安全运行。 只有在满意时,它只会产生一个可执行文件。

在我们的案例中,它意识到我们的债务处理技能是子分析,我们对二进制文件的要求被拒绝。

程序员的作用是了解生锈法是什么,并确保它被粘附。所有的怪癖,所有的怪癖,所有的假设。否则,Rust编译器会对我们大喊大叫。另一方面,铁锈团队一直试图通过创造一大句法糖和最重要的易读错误消息来实现物品。那份,与体面的文件和伟大的社区相结合,使语言有趣。

在生锈大陆中,变量是球员。球员必须属于某些课程 - 法师,牧师,一个结构。此外,每个玩家可以具有不同的设备。那讲得通;你可以有两个牧师,一个人与员工和一个魔杖,对吗?

以前从中记得dbg!()这是一个宏,它是一个粗略的javascript的console.log。让我们创建自己的键入变量并记录它。

我们创建了一个结构,基本上是一种类型。然后我们创建了该类型的对象。最后,我们要求记录该对象。

不。我们的球员是一个如此的菜鸟,它甚至没有能够提供调试信息。真的!惊人…

这里的关键点是手工制作的变量全部启动为1级储蓄,没有设备。这里是设备(Rife Lingo中的特质)发挥作用的地方。

这次,它有效。唯一的区别是顶部的线。在这里,我们用调试特征装备了noob。现在,我们的玩家有资格登录 - 什么里程碑!

铁锈有一定的设备。一些人更普遍。并且,正如所预期的那样,它可以通过使用自己的设计来伪造新的。

可以由编译器为我们自动生成一些特征。这就是这里发生的事情 - 编译器能够减轻我们的琐碎工作。其他时间,实际的实现留给您。你想要一个用于你的法师的石墨盔甲?不是问题,当然是可行的,但你必须提供关于它实际工作原理的代码。

特质深深嵌入了锈的织物中。让我们返回之前吹来的所有权示例。仔细阅读错误消息,我们注意到编译器向我们解释了变量的所有权必须是“移动”,因为字符串不会实现该特征副本。否则,编译器 - 就像它一样 - 就是它的副本而不是移动。

副本特征意味着您拍摄一部分内存,并且您将其映像在其他地方,直接按字节操作。

好的,所以字符串没有副本特征,我们只需要告诉编译器提供它吗?抱歉不行。副本太低了级别,用于安全使用它。编译器知道那是如此,所以我们什么都没有。当然,如果故事结束那里,Rust不会是一种有用的语言。有一个更明显的特质,几乎相同的东西 - 克隆,因为它被称为。字符串确实有克隆特征,所以我们只是想使用它而不是副本。

以下情况是,编译器看到我们想要在“内在范围”中使用的内部范围内,但现在它也可以看到我们的工作完全良好,而不是实际的克隆。所以我们有以下几点:

美丽的。当然,这不是解决这个特定问题的唯一方法,但它与我们对所有权和特征的探索探索很好。

在包装这篇文章之前,还有一件事我们应该触及一点。我们谈到了所有权以及它与范围有关,但事实是这只是一种简化。 Rust采用寿命的概念,以保持正确的所有权。它只是恰好的大部分时间,寿命和范围都一致。但有时,编译器需要帮助。因此,我们被允许直接与那些寿命一起工作 - 在某些情况下我们必须。

绝对不!如果RUTR是冰山,那么甚至不能考虑尖端。如果生锈是蛋糕,那就甚至不是光泽。如果生锈是一个加密货币,这甚至不是缎子。但我显然不是今天举行励志隐喻,所以让我们休息。

在我的经验中,学习生锈很有趣。有一个陡峭的曲线,但同时,复杂性的量是你通过投资你的时间来获得的价值“就是正确的”。我肯定会继续我的锈病旅程!