初学 Rust 有感而发 20221221

前言

最近,宇润突然想学下很火热的 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++ 需要 mallocfree,或者 newdelete,也不像其它高级语言一样有引用计数自动垃圾回收机制。

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,不妨多吃点补脑食物。

符号过多也是个问题,阅读代码有些眼花缭乱。

这篇水文主要列了一些跟主流语言差异大的部分,并不是觉得这些特性不好,只不过我还没习惯。

目前也只是浅尝辄止,后面我会寻找使用场景,继续深入研究。

你可能感兴趣的:(rustrust-lang)