高性能 - Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。
可靠性 - Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。
https://github.com/rust-lang/rust
学习资料
https://www.runoob.com/rust/rust-tutorial.html
https://play.rust-lang.org/
https://www.rust-lang.org/zh-CN
https://www.rust-lang.org/learn
https://github.com/rustcc/RustPrimer
https://github.com/ZhangHanDong/tao-of-rust-codes
https://zhuanlan.zhihu.com/p/47179483
https://github.com/rust-unofficial/awesome-rust
在线编译环境
https://play.rust-lang.org/
环境搭建
https://www.rust-lang.org/zh-CN/tools
https://www.rust-lang.org/zh-CN/tools/install
https://code.visualstudio.com/
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
% rustc -V
rustc 1.53.0 (53cb7b09b 2021-06-17)
Rust 的编译工具依赖 C 语言的编译工具,这意味着你的电脑上至少已经存在一个 C 语言的编译环境
vscode 里安装 rls 和 Native Debug 两个扩展。
Cargo 是 Rust 的构建系统和包管理器。
cargo new greeting
当前文件下下会构建一个名叫 greeting 的 Rust 工程目录。
% tree
.
|____greeting
| |____Cargo.toml
| |____src
| | |____main.rs
|____.git
| |____config
| |____objects
| | |____pack
| | |____info
| |____HEAD
| |____info
| | |____exclude
| |____description
| |____hooks
| | |____commit-msg.sample
| | |____pre-rebase.sample
| | |____pre-commit.sample
| | |____applypatch-msg.sample
| | |____fsmonitor-watchman.sample
| | |____pre-receive.sample
| | |____prepare-commit-msg.sample
| | |____post-update.sample
| | |____pre-merge-commit.sample
| | |____pre-applypatch.sample
| | |____pre-push.sample
| | |____update.sample
| |____refs
| | |____heads
| | |____tags
cd greeting
cargo build && cargo run
Compiling greeting v0.1.0 (/Users/xiazemin/rust/greeting)
Finished dev [unoptimized + debuginfo] target(s) in 6.50s
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running target/debug/greeting
Hello, world!
为什么 println!( “Hello World”) 中的 println 后面还有一个 ! 符号
println 不是一个函数,而是一个宏规则。
Rust 中格式字符串中的占位符不是”% + 字母”的形式,而是一对 {}。
在 {} 之间可以放一个数字,它将把之后的可变参数当作一个数组来访问,下标从 0 开始。
如果要输出 { 或 } 怎么办呢?格式字符串中通过 {\{ 和 }} 分别转义代表 { 和 }。
变量
首先必须说明,Rust 是强类型语言,但具有自动判断变量类型的能力。这很容易让人与弱类型语言产生混淆。
如果要声明变量,需要使用 let 关键字。
let a = 123;
以下三行代码都是被禁止的:
a = “abc”;
a = 4.56;
a = 456;
第一行的错误在于当声明 a 是 123 以后,a 就被确定为整型数字,不能把字符串类型的值赋给它。
第二行的错误在于自动转换数字精度有损失,Rust 语言不允许精度有损失的自动数据类型转换。
第三行的错误在于 a 不是个可变变量。
Rust 语言为了高并发安全而做的设计:在语言层面尽量少的让变量的值可以改变。所以 a 的值不可变。但这不意味着 a 不是”变量”(英文中的 variable),官方文档称 a 这种变量为”不可变变量”。
使变量变得”可变”(mutable)只需一个 mut 关键字。
let mut a = 123;
a = 456;
常量与不可变变量的区别
以下程序是合法的:
let a = 123;
let a = 456;
但是如果 a 是常量就不合法:
const a: i32 = 123;
let a = 456;
变量的值可以”重新绑定”,但在”重新绑定”以前不能私自被改变,这样可以确保在每一次”绑定”之后的区域里编译器可以充分的推理程序逻辑。 虽然 Rust 有自动判断类型的功能,但有些情况下声明类型更加方便:
let a: u64 = 123;
这里声明了 a 为无符号 64 位整型变量,如果没有声明类型,a 将自动被判断为有符号 32 位整型变量,这对于 a 的取值范围有很大的影响
重影(Shadowing)
重影的概念与其他面向对象语言里的”重写”(Override)或”重载”(Overload)是不一样的。重影就是刚才讲述的所谓”重新绑定”,之所以加引号就是为了在没有介绍这个概念的时候代替一下概念。
重影就是指变量的名称可以被重新使用的机制