从零开始的 Rust 学习笔记(0)

----------------------------
| Hello fellow Rustaceans  |
----------------------------
              \
               \
                  _~^~^~_
              \) /  o o  \ (/
                '_   -   _'
                / '-----' \

一点点前言~这个系列一大部分算是学习 Rust 语言的自用笔记,另一部分也算是分享给有需要的人,整体上来说会跟着「The Rust Programming Language」这本书来走,可能偶尔也会突然自己写点什么小东西~

虽然说是自用笔记,但是既然写了还是会尽力让看到的人能够看明白这样子;同时也因为是自用笔记,所以在跟着「The Rust Programming Language」书的时候,并不一定会在所有东西第一次出现时就解释得非常清晰,我会以自己的学习风格为主来写这个系列

首先是安装 Rust,https://www.rust-lang.org/learn/get-started,打开这个链接之后会见到如何安装 Rust 的操作。比如 macOS 或者其他 Unix-like 的系统的话,则是利用如下命令安装

curl https://sh.rustup.rs -sSf | sh

这一步会安装 cargo, rustic, rustup 和一些其他的 rust 会用到的命令。

在安装完之后,会提示需要将这些二进制所在的 $HOME/.cargo/bin 加入到环境变量 PATH 中,那么只需要编辑 ~/.bashrc,或者 ~/.zshrc,或者编辑自己所使用的 SHELL 的初始化脚本。加入如下一行

export PATH="\${HOME}/.cargo/bin:\${PATH}"

然后 source 一下初始化脚本,或者新开一个终端,接着跟着 rust-lang.org 的 guide,使用 rustup 安装 rustfmt 和 clippy 这两个 components。

rustup component add rustfmt
rustup component add clippy

前者是用于格式化 rust 代码,后者则是用于提示代码中潜在的问题等。

接着可以便可以用 cargo 新建一个 hello-rust 的项目用来测试 rust 环境了

cargo new hello-rust

这一步会在当前目录下创建一个 hello-rust 的文件夹,其目录结构如下

hello-rust
├── Cargo.toml
└── src
    └── main.rs

Cargo.toml 类似于 Swift 项目中的 package.swift,用于记录包名字、版本、作者以及项目依赖等等信息。在 https://doc.rust-lang.org/cargo/reference/manifest.html 可以找到更详细的描述。

然后在 src 子目录下的 main.rs 显然就是代码文件了~

要运行这个 hello-rust 的项目也非常简单,只需要执行

cargo run

就可以看到 cargo 会自动调用 rustc 去编译、运行这个项目了

接下来 rust-lang.org 则是简单介绍了如何添加一个依赖,这一步只需要编辑 Cargo.toml 下面的 dependencies section 即可~

比如要添加 ferris-says 这个包,并且要求版本为 0.1 的话,则

[dependencies]
ferris-says = "0.1"

保存 Cargo.toml 后就可以~不过 cargo 默认的 crates 源是 crates.io,在国内访问相当的慢,可以使用 USTC 的镜像去替换,编辑一下 $HOME/.cargo/config 文件~

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

接下来就可以使用

cargo build

来构建项目了,cargo 会自动下载所有需要的依赖~

之后就是使用 ferris-says 了~

use ferris_says::say;
use std::io::{stdout, BufWriter};

fn main() {
  let stdout = stdout();
  let out = b"Hello fellow Rustaceans!";
  let width = 24;

  let mut writer = BufWriter::new(stdout.lock());
  say(out, width, &mut writer).unwrap();
}

可以看出来其实 Rust 语言并没有跟别的差异特别大,比如我们对比在引入模块/包上的话,

C/C++ 引入文件使用 include,使用模块则是 using namespace;Perl 与 Rust 一样使用 use;Python / Objective-C / Swift 则是 import。这里其实各语言间大同小异。

包里的子包或者类的话,与 C++ 相同,Rust 也是采用了 :: 作为分隔。

定义函数 Rust 则是使用了 fn 作为关键字,与 Golang 相同;而 Python 是 def,Swift 是 func …

字符串、数字、变量声明也都可以看到各种影子(毕竟又不是刻意去设计与众不同的语法)

那么保存运行的话,则是

cargo run

Leave a Reply

Your email address will not be published. Required fields are marked *

12 + eight =