\ 本文列出了几个主题,如果您是 JavaScript 开发人员,这些主题将帮助您快速了解Rust 。许多教程从头开始。但是,如果您已经知道其他东西,为什么不比较它们呢?
\ 这些是我希望在开始 Rust 之前可以参考的差异,保持简短。
\免责声明!
我远非精通 Rust。这些就是我对它们的解释,仅此而已。 Rust 有相当多的文档,所以如果你正在寻找详细信息,请用谷歌搜索它们。这本书是学习 rust 的一个很好的起点。我的目标是列出重要的事情,以便您(以及将来的我)可以跳过常见的编程概念,并根据您已经知道的知识专注于差异。
类型
Rust 是一种类型化语言,因此它更接近于 TypeScript。如果您已经了解 TS,您将获得更好的体验。
\ 在大多数情况下,这两种语法都是相似的( variable_name: Type )好极了!
蛇案例
是的,没有绕过它。
这个符号是什么?
1. 问号( ? )
你可能会看到?在这样的函数调用之后: my_function()?;
.
不,这不是可选链接。对于可能失败的函数(易错函数),这是一种错误处理魔法。在处理异步函数时,您通常会看到这一点。稍后再详细介绍。
2.功能上的感叹号( ! )
示例: println!("{:?}", my_variable);
这表明它是一个宏。 JS 没有类似的东西。宏是一种编写其他代码的代码的方式。您可以将其视为自定义语法糖。如果函数示例显示它,只需使用它。
3. &符号
示例: &your_variable
获得参考。如果您使用 C 等低级语言,您就会知道这一点。稍后会详细介绍。
句法
- 每行末尾的分号 ( ; ) 是强制性的
- 例外:分号 ( ; ) 在函数的最后一行不是强制性的。在这种情况下,它是返回该 line 的快捷方式。
- 函数语法略有不同。没有大碍。
fn foo(num: i32) -> i32 { 3 // See no.2 // or // return 3; }
\
- 装饰器语法也不同。它也称为属性。
这些关键词是什么?
结构
它是一个 JSON 对象。 (好的,它更复杂,但请参阅文档)
type Person = { firstName: string; lastName: string; }; struct Person { first_name: String, last_name: String, }
特征
暗示
一个 trait 的实现。我们最接近的就是类。它是trait
和类型之间的联系。我没用过
枚举
在某种程度上与 Typescript 枚举非常相似。但是您可以在其中存储数据。对于异步来说,这是一个非常简洁且非常重要的概念。
控制台日志
println!("{:?}", my_variable);
库/依赖项
使用Cargo.toml
而不是package.json
。您需要手动添加它们(而不是使用类似yarn add
的命令)
例子:
[dependencies] chrono = "0.4" egg-mode = "0.16.0"
输入
Rust 有模块。它与 JS 完全不同,但基本上:
它们有点像命名空间。
\ 以下是导入依赖项的详细说明:
use rocket::serde::{json::Json, Deserialize, Serialize};
use
– 使用它而不是import
rocket
– 这是包名
::
– 访问模块
serde
– 模块名称
{json::Json, Deserialize, Serialize}
– 实际导入的东西
\ 更多语法:
use chrono::prelude::*;
use rusqlite::Result;
从本地文件导入
最佳解释: https ://doc.rust-lang.org/rust-by-example/mod/split.html
\ 对要导入的路径/文件使用mod
以使编译器包含该模块。
\ 然后use
导入它。注意: mod
也会自动导入它。在这种情况下,您需要为其添加前缀crate
。
\ 例子:
use crate::your_file_or_module;
注意: mod.rs
是一个特殊的文件名,其作用类似于index.js
\ 有关示例,请参见上面的链接。
常量与让
在 JavaScript 中,您大部分时间都会使用const ,因为它是不可变的。
\ 在 Rust 中,你会想用let代替。默认情况下这是不可变的。如果您希望它是可变的,请使用mut关键字。 const保留用于实际常量(因此您无法从另一个变量计算值)
let immutable_variable = ...; let mut mutable_variable = ...; const MY_CONSTANT = "CONSTANT";
图书馆文档
如果 Github repo 没有链接到文档页面,你可以这样访问它:
异步
到目前为止,最令人困惑的 2 个主题是期货和所有权。我建议阅读更全面的文档。我们先来谈谈期货。
\ Future
就像一个Promise
。与 JS 不同,Rust 有一个类型为 promise/future 的结果,称为Result
。它还接受泛型上的错误类型(我希望 JS 有这个)。您也可以在没有future
的情况下单独使用Result
。
执行(或“消费”)Future
标准库非常简单,因此您需要导入其他内容(Think bluebird for JS)。你需要一个 executor 来运行一个future
。我建议使用https://github.com/tokio-rs/tokio并阅读他们的文档。
.await
等待一个函数
async_function().await;
有趣的语法,是吗?实际上相当不错,因为您不必像在 JS 中那样用括号括起来。
处理结果
这是另一个重要的。 Rust 是安全的,所以你需要处理所有事情。是的,与 JS 不同的所有错误情况!
\ Result
枚举有Ok
和Err
。如果 future 成功,则返回Ok
,否则返回Err
。
\ 处理这两种情况最全面的方法:
let f = File::open("hello.txt"); let mut f = match f { Ok(file) => file, Err(e) => return Err(e), };
上面使用的模式匹配语法也很棒。
\ 这很冗长,所以有两种常用的方法来缩短它:
\
- 使用
.unwrap()
示例: let my_value = async_function().await.unwrap();
仅当您确信它不会出错或在测试环境中时才使用它。
\
- 使用
?
句法
这会将错误向上传递。因此,您的函数也需要能够返回错误( Result
或Option
)
所有权和参考资料
听说过借阅检查器吗?我在这里没什么好说的。这是此列表中最难的事情,因为它是生锈所独有的。如果您以前从未处理过引用,那么这个主题可能有点陡峭。
\ 谢天谢地,生锈的书再次拯救了一天
就是这样!
这个列表实际上比我预期的要短。我希望它对你的旅程有用。
看到错误或有什么建议?让我知道!
也在这里发布
原文: https://hackernoon.com/rust-from-0-to-80percent-for-javascript-developers?source=rss