前言
最近,宇润突然想学下很火热的 Rust 语言,毕竟连著名大喷子 linus 都接纳了 Rust,肯定有它的可取之处。
通过这篇文章来分享一下,我学习 Rust 语言的经验心得,如有说得不对请轻喷。
Rust 语言官网:https://www.rust-lang.org/zh-CN
竟然有官方中文,表扬!
安装
首先要来安装 Rust,我是打算在 wsl 里开发,所以安装了 Linux 版本。(当然 Windows 甚至有安装包,也是很方便)
Rust 安装:https://www.rust-lang.org/zh-...
一句话安装:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
跟我想象中的完全不一样,不用梯子也可以很快下载好,安装也不用很繁琐的步骤,让我不敢相信已经装完了。
编辑器
我是 VSCode 的忠实用户,写 PHP、H5、C、C++ 都是用 VScode 写的,这次学 Rust 也不例外。
搜了一下 “Rust” 关键词,遇事不决,选择下载量最多的:rust-analyzer
如何学习
好久没有学过新的语言了,反正每次刚入门的时候都是最头大的。
我选择直接看官方文档,通过一些例子来了解语言的基本特性和写法等等。
学习 Rust:https://www.rust-lang.org/zh-...
练手项目
接下来就是找个小项目练练手,融会贯通,争取成功入门。
现在新生代的语言出厂自带包管理器已经成为了标配,Rust 的包管理器叫作 Cargo。
我先创建一个项目目录,然后在里面执行:cargo init
这样一个项目骨架就生成好了。
接下来就是将前面学习基本特性阶段的知识拿过来搭积木了,当然中间遇到了很多问题,通过查文档、百度、Google、不断调试最终都顺利解决。
cargo
拉依赖如果慢的话,需要在 ~/.cargo/config.toml
中配置国内镜像源:
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "https://mirrors.ustc.edu.cn/crates.io-index"
经过我的努力,终于完成了一个简易 Webhook 服务,支持 Gitee 和 Github。
rust-webhook:https://github.com/Yurunsoft/...
由于是一个非常非常非常简单的小项目,里面用到的特性非常少,可能离入门还有很长一段距离。
总结
变量默认不可变
Rust 的变量默认是不可变的,我觉得他就不应该叫他变量。
fn main() {
let a = 1;
a = 2; // 编译不通过,变量 a 不可变
println!("a={}!", a);
}
你得给变量声明 mut
,那这个变量才是可变的。
fn main() {
let mut a = 1;
a = 2;
println!("a={}!", a);
}
值得一提的是,大部分场景,编译器会猜测你的变量类型,而不必声明类型。当然你也可以声明变量类型。
内存管理
Rust 不像 C/C++ 需要 malloc
和 free
,或者 new
和 delete
,也不像其它高级语言一样有引用计数自动垃圾回收机制。
Rust 是通过借用机制管理内存的,这也是为什么 Rust 号称比 C/C++ 更加内存安全,并且比其它高级语言性能更好。
例子1-编译报错:
fn main() {
let a = String::from("test");
let b = a; // 赋值:a 被 b 借用,a 变量不再可用
println!("a={}!", a); // 编译不通过,a 变量被借用不可用
println!("b={}!", b);
}
例子1-通过编译:
fn main() {
let a = String::from("test");
let b = &a; // 引用
println!("a={}!", a);
println!("b={}!", b);
}
例子2-编译报错:
fn main() {
let a = String::from("test");
test(a); // 传参:a 被传参借用,a 变量不再可用
println!("a={}!", a); // 编译不通过,a 变量被借用不可用
}
fn test(str: String) {
println!("str={}!", str);
}
例子2-通过编译:
fn main() {
let a = String::from("test");
test(&a); // 引用传参
println!("a={}!", a);
}
fn test(str: &String) {
println!("str={}!", str);
}
错误处理
Rust 默认不会捕获错误,我们需要在每个方法调用之后,跟上 .unwrap()
让它自动处理,如果这个函数返回错误就失败。
use std::fs;
fn main() {
let data = fs::read("1.txt").unwrap();
println!("data={:?}", data);
}
或者捕获后抛出自定义信息:
use std::fs;
fn main() {
let data = fs::read("1.txt").expect("我是错误信息");
println!("data={:?}", data);
}
个人感觉 Rust 的错误处理相比 Go 要好一些,但也不是太优雅,会造成代码非常啰嗦。
最后总结
Rust 语言是一个非常“阴间”的编程语言,写起来跟我们通常用的编程语言思路都不一样。
初上手时候,脑细胞会消耗得非常多,如果你也在学 Rust,不妨多吃点补脑食物。
符号过多也是个问题,阅读代码有些眼花缭乱。
这篇水文主要列了一些跟主流语言差异大的部分,并不是觉得这些特性不好,只不过我还没习惯。
目前也只是浅尝辄止,后面我会寻找使用场景,继续深入研究。