最近,在多年的 Java 开发之后,我开始学习 Rust。脑海中不断浮现的五个要点是
- Rust 感觉很熟悉
- 引用有意义
- 所有权将会变得有意义
- Cargo 非常有用
- 编译器非常出色
我绝对坚持所有这些观点,但我还有更多要说,因为我现在感觉自己像一个 Rustacean1 ,因为
- 我再也不想用其他任何语言编程了。
- 我已经摆脱了简单的咒语。
我所说的这两个声明是什么意思?嗯,第一个很简单:Rust 感觉是未来的方向。它结构良好、富有表现力,并且帮助你做正确的事情,2 它有很棒的文档和工具,并且有一个很棒的社区。当然,这一切都是开源的,这正是我深深关心的事情。
这是一个 Rust 使用示例
// Where checkhashes is pre-defined vector of hashes to verify
let algorithms = vec![String::from("SHA-256"); checkhashes.len()];
这会创建一个名为“algorithms”的新向量,其长度与向量“checkhashes”相同,并用字符串“SHA-256”填充它。第二个呢?好吧,我决定为了正确学习 Rust,我应该采用一个最初用 Java 编写的项目,并希望以相当地道的 Rust 重新实现它。不久之后,我开始修复错误——并犯错误——围绕实现而不是围绕语法。我不仅仅是从教程中复制文本,或者根据编译器输出对我的代码进行看似随机的细微更改。换句话说,我让代码编译通过,理解了它们为什么编译通过,然后只是犯了编程错误。3
这是另一个示例,应该会感觉非常熟悉
fn usage() {
println!("Usage: findfromserial KEY_LENGTH INITIAL_SALT CHECK_HASH1 [CHECK_HASH2, ...]");
std::process::exit(1);
}
这是一个巨大的进步。当你开始学习一门语言时,很容易只是复制粘贴你在其他地方看到的文本,或者摆弄不熟悉的结构,直到它们——勉强——工作。使用或生成你并不真正理解但似乎可以工作的代码有时被称为“使用咒语”(来自小说、电影和游戏中的大多数魔术师背诵一系列“只是工作”的魔语,而没有真正理解他们在做什么或单词组合实际意味着什么的想法)。有些语言4 特别容易出现这种方法,但许多——大多数?——学习新语言的人在刚开始时都容易这样做,只是因为他们想让事情正常工作。
最近,我一直熬夜到凌晨 1 点来实现一个新功能——接受命令行输入——我真的搞不懂。我花了很多时间在这上面(包括寻找——但未能找到——一些合适的咒语),然后在内部 rust-lang 频道上寻求了一些帮助。(你可能想注册 通用 Slack Rust 频道,那里住着一些我认识的人。)一些人对哪里出了问题提出了一些建议,其中一个人非常乐于助人地分析了一些建议,所以我更好地理解了它们。他解释了很多,但最后说,“我不知道你调用的哈希函数的返回类型——我认为这是一个你自己弄清楚的好地方。”
这就是我试图达到的目标
checkhashes = std::env::args()
.skip(3)
.map(|x| hex::decode(x))
.collect::<Result<Vec<Vec<u8>>, _>>()
.unwrap();
在你想通之前它可能看起来很奇怪,但它实际上按你可能期望的那样工作:我想从命令行获取输入,跳过前三个输入,迭代其余输入,将每个输入转换为 u8 向量并创建一个向量。 “collect”调用的末尾的 _
会收集任何错误或问题,并基本上将其丢弃。
这正是我需要的,也是任何学习任何东西的人(包括编程语言)所需要的。所以当我在午夜不得不下楼放狗时,我决定留在楼下,看看我是否可以自己解决问题。我做到了。我采纳了人们提出的建议,理解了他们在做什么,试图推测他们应该做什么,弄清楚他们应该如何做,然后找到了实现它的正确方法。
我还有很多东西要学,我仍然会犯很多错误,但现在我觉得我已经能够找到解决这些错误的方法(可能需要一些帮助——感谢所有已经为我指明正确方向的人)。但我确实觉得我现在真的在用 Rust 编程。我喜欢它。
- 这就是 Rust 程序员对自己的称呼。
- 完全阻止人们做错事几乎是不可能的,但鼓励人们做正确的事是很棒的。事实上,Rust 更进一步,实际上使得在许多情况下难以做错事。你真的必须非常努力才能在 Rust 中做坏事。
- 例如,我在我的代码中发现了一个特别离谱的差一错误,这与 Rust 无关,而与我没有足够注意程序流程有关。
- 咳嗽 Perl 咳嗽
本文基于 More Rusty thoughts 在 Alice, Eve and Bob – 安全博客上发布,并经许可重复使用。
10 条评论