乐趣区

关于rust:初学-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,无妨多吃点补脑食物。

符号过多也是个问题,浏览代码有些目迷五色。

这篇水文次要列了一些跟支流语言差别大的局部,并不是感觉这些个性不好,只不过我还没习惯。

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

退出移动版