欢迎回来!
“Hello world”几乎是学习任何语言的第一个程序了,学习Rust页不例外。在开始之前,请你先确保在自己电脑上安装了Rust。如果你还没有安装的话,我们一起安装一遍,不过,我使用的是Linux操作系统,其他系统可能略有不同,这个你需要注意。Rust 使用 Rustup 安装,你也可以查看更详细的文档:Rustup。
首先,打开一个终端,输入:
$ curl https://sh.rustup.rs -sSf | sh
这行代码会帮助我们下载一个小脚本并运行它,由于网络的原因,你需要耐心等待,多尝试几次, 直到出现类似的字样:
……
Current installation options:
default host triple: x86_64-unknown-linux-gnu
default toolchain: stable
modify PATH variable: yes
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>
到这里,离成功就不远了。接着,跟据提示,输入“1”并按下回车,就会开始下载一些组件了,你会看到如下字样:
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2018-08-02, rust version 1.28.0 (9634041f0 2018-07-30)
info: downloading component 'rustc'
20.1 MiB / 68.6 MiB ( 29 %) 493.4 KiB/s ETA: 101 s
由于网络原因,你还需要等待一阵子,或者可以考虑其他办法。直到你看到如下输出:
Rust is installed now. Great!
To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done automatically.
https://doc.rust-lang.org/cargo/index.html
To configure your current shell run source $HOME/.cargo/env
恭喜你,Rust 已经安装完成了,包括自带的 Cargo 包管理器。我们还需要将$HOME/.cargo/bin
添加到环境变量“PATH”中,编辑 $HOME/.profile
文件,在最后面追加export PATH="$HOME/.cargo/bin:$PATH"
就可以了,不过,如果是Ubuntu等系统,Rustup会自动给你添加环境变量。
添加完环境变量后,你需要重启一下系统,或者注销后重新登录。我们打开一个终端并输入:
$ rustc -V
rustc 1.28.0 (9634041f0 2018-07-30)
那说明没有什么问题。
我们进行第一个程序。用你喜欢的编辑器创建一个文件:
$ vim hello_world.rs
然后在文件中输入:
fn main() {
println!("hello world!");
}
编译并运行:
$ rustc hello_world.rs
$ ./hello_world
hello world!
也可以使用Cargo:
$ cargo new hello_world --bin
Created binary (application) `hello_world` project
$ cd hello_world
注意后面的 --bin
参数,这将告诉Cargo创建一个可执行程序,而不是库。
我们可以看到,cargo 自动创建了 src
目录和Cargo.toml
文件(类似于nodejs的package.js文件),实际上,cargo还初始化了Git仓库并创建了.gitignore
文件。因此在这之前,你应该先安装并配置好Git。
我们打开Cargo.toml
文件:
[package]
name = "hello_world"
version = "0.1.0"
authors = ["xxx <xxx@xxx.com>"]
[dependencies]
[package]
片段中,包含了项目的名称、版本和从Git配置中读取的作者和作者邮箱。[dependencies]
片段中包含了项目的依赖。今后,我们还需要修改Cargo.toml
文件。你还可以去查看 Cargo 的文档。
我们进入src
目录中的main.rs
文件:
cd src
vim main.rs
Cargo 已经帮我们写好了“hello world!”, 我们可以直接运行:
$ cargo run // 编译并运行
Compiling hello_world v0.1.0 (file:///home/xxx/hello_world)
Finished dev [unoptimized + debuginfo] target(s) in 0.29s
Running `/home/xxx/hello_world/target/debug/hello_world`
Hello, world!
或者也可以先编译,后运行:
$ cargo build // 编译
Compiling hello_world v0.1.0 (file:///home/xxx/hello_world)
Finished dev [unoptimized + debuginfo] target(s) in 0.20s
$ ./target/debug/hello_world 运行
Hello, world!
我们会发现,项目目录下又多出了一个Cargo.lock
文件和target
目录,Cargo.lock
文件由Cargo维护,不需要手动修改,target
目录用于存放可执行文件和一些临时文件,也不需要我们手动去维护。部分临时文件是可以复用的,以提高下次编译时的编译速度。
我们执行cargo run
或cargo build
时,默认生成的可执行文件存放在target/debug
目录下,虽然编译速度更快,但运行较缓慢,还包含了一些调试信息,导致生成的可执行文件体积也稍大。我们可以添加--release
参数来开启编译器优化,会在target/release
目录下生成可执行文件,这时候编译速度较慢,但是程序的运行速度会更快。
还有一个常用命令是 cargo check
,只检查代码是否可以编译而不生成可执行文件,因而速度比cargo build
还要快。这里要说明的是,Rust的编译器非常强大,大部分情况下,只要能够编译通过的程序,运行是没有什么问题的。
再来解释以下这段代码:
fn main() {
println!("hello world!");
}
第一行,fn
是Rust中的一个关键字,用于定义一个函数,main
是Rust的入口函数。要注意,函数体必须包裹在{}
中,不可省略。对换行和缩进也没有要求;
第二行,println!
调用了一个“宏”而不是函数,注意“!”,调用函数不需要“!”,当看到“!”的时候就意味着调用的是一个“宏”而不是普通的函数,在后面会介绍“宏”。"hello world!"是一个字符串,作为参数传递给println!
,println!
负责将“hello world!”打印到屏幕上。
我们的目的达到了没有?然而并没有,我们需要在浏览器上输出“hello world!”,不仅仅是在终端上。不管你在此之前是否听说或了解过HTTP协议和TCP协议,目前主流浏览器通常是先跟HTTP Server建立TCP连接,再通过TCP向HTTP Server发送HTTP请求。HTTPS又在TCP和HTTP中间加了一层SSL协议,在发送HTTP请求之前,还需要进行SSL协议“握手”,我们暂且不谈HTTPS。
Rust标准库中没有HTTP Server的实现,(Golang的同学请不要笑,Golang的标准库杂而不精,等后面你就知道Rust是多么好用了),没关系,接下来我们实现一个玩具级别的。
请看下一节!
参考链接
https://doc.rust-lang.org/book/second-edition/
https://doc.rust-lang.org/std/
https://kaisery.github.io/trpl-zh-cn/
https://doc.rust-lang.org/cargo/
https://github.com/rust-lang-nursery/rustup.rs/blob/master/README.md
有疑问加站长微信联系(非本文作者)