初学者学习Rust容易碰到的问题 - tim


对许多人来说,学习 Rust 感觉很难。更重要的是,人们推迟学习 Rust 是因为认为它可能太难了。
人们经常争辩说,Rust 的所有权和生命周期概念很新颖,因此很困难。我想知道这是否完全正确。所有编程语言都有困难的概念。我怀疑学习 Rust 的困难部分是由核心语言之外的因素造成的。
学好 Rust 涉及学习驾驭充满行话和隐含文化规范的社会文化、景观。
下面是初学者容易碰到的问题:

String和&str之间的区别是什么?
如果Rust社区找到一种方法来快速回答这个问题--这恰好是Stack Overflow上rustlang标签中评分最高的问题--给那些刚接触Rust的人,那么它作为一种通用的编程语言就会成功。
如果没有一个简洁的答案,Rust对很多人来说仍然是神秘的。

理解String vs &str意味着对所有权系统的理解,这意味着对生命周期系统的理解。
这可能意味着你已经接触到了指针、引用,甚至可能是别名。
这里通常会交织着关于可变性的讨论。
获得对表示文本的数据类型的直觉得益于对编码的理解,而编码则得益于对CPU运行方式的理解。

我还没有为完全的初学者找到一个pass的心理方法。但是我知道另一种系统编程语言的学习者在这里有明显的优势。

常见的策略是告诉用户:他们应该 "暂时使用String"。
每个人都知道,这只是一个半答案。一个旨在给学习者一些时间的答案。但这甚至不是一个半答案。
不用多久,他们就会遇到一个以&str(或者更糟糕的是AsRef<str>)为参数的函数的参数。

难以找到的默认值
每当你在用户面前放置一个需要他做决定的决策点,你就会引入认知负荷。
认知负荷对于初学者来说尤其昂贵,他们需要在工作记忆中保留大量的细节,以便在编写代码时取得进展。

Rust社区重视精确性。我们关心我们的价值观是如何在内存中布局的。
我们希望给开发者提供强大的类型安全,这样他们就能写出健壮的程序。

不幸的是,对于Rust的新用户来说,往往有多种选择,而这些选择看起来应该是没有的。

  • 哪种数字类型是 "正确的"?
  • 什么时候应该使用&str、String、Cow、T: Display、T: AsRef<str>、T: Into<string>或其他任何选项?
  • HashMap vs BTreeMap用于映射键和值
  • 很难理解几个听起来相似的特性之间有什么区别,例如ToString vs ToOwned vs Into<string>和Debug vs Display。
  • 为什么有这么多转换类型的方法?什么时候应该使用 as 关键字?.into()、T::from()和.try_into()怎么样。

我们应该在给予指导方面做得更好。

难以知道该使用哪个crate
Rust有一个由crates.io支持的丰富的crate生态系统,它提供了语义版本和不可变的版本。这使得库的作者可以在可靠性的支持下进行快速而强大的创新。这个生态系统也有它的弊端。

crates.io的无命名空间政策很容易导致名字被盗用,而通常由一个作者编写的单个库则很容易受到侧面攻击。

我认为,可能会有另一个crate注册中心的空间,它提供精心策划的板块集合,可能在保留的命名空间内。(如果我有几百万美元,这将是我的创业想法!)。

这种情况是难以驾驭的,特别是对于初学者。我们的crate有可爱的名字,而不是描述性的名字。
需要一些经验才能知道parking_lot是优秀的同步基元的crate。

也许解决这个问题的方法之一是提供精心策划的crate集合。