变量
使用变量储存值
let a = 5;
在rust中,变量是默认不变的。创建一个a的变量并把它绑定到值5上。
使用mut 来使一个变量可变
let apples = 5; // immutable
let mut bananas = 5; // mutable
let mut guess = String::new();
这一行创建了一个可变变量,当前它绑定到一个新的 String 空实例上。
use std::io;
从标准库中引入了输入/输出功能。现在调用 io 库中的函数 stdin:
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
read_line 的工作是接收用户在标准输入中输入的任何内容,并将其追加到一个字符串中(不覆盖其内容),因此它将该字符串作为参数。这个字符串参数需要是可变的,以便该方法可以通过添加用户输入来改变字符串的内容。
& 表示这个参数是一个 引用(reference),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。
如果 io::Result 实例的值是 Err,expect 会导致程序崩溃,并显示当做参数传递给 expect 的信息。如果 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 io::Result 实例的值是 Ok,expect 会获取 Ok 中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。
使用 println! 占位符打印值
let x = 5;
let y = 10;
println!("x = {} and y = {}", x, y);
例子
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
更新 crate 到一个新版本
cargo update
生成随机数
use std::io;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
新增了一行 use
:use rand::Rng
。Rng
是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。
rand::thread_rng
函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接下来,调用随机数生成器的 gen_range
方法。这个方法由刚才引入到作用域的 Rng
trait 定义。gen_range
方法接受一个范围表达式作为参数,并在该范围内生成一个随机数。我们在这里使用的范围表达式采用 start..end
形式,它包含下限但不包含上限,所以需要指定 1..101
来请求一个 1 和 100 之间的数。另外,我们也可以传递 1..=100
,这是等价的。
运行 cargo doc --open
命令来构建所有本地依赖提供的文档,并在浏览器中打开。
隐藏变量
fn main() {
let x = 5;
let x = x + 1;
{
let x = x * 2;
println!("The value of x in the inner scope is: {}", x);
}
println!("The value of x is: {}", x);
}
先将 x 绑定到值 5 上。接着通过 let x = 隐藏 x,获取初始值并加 1,这样 x 的值就变成 6 了。然后,在内部作用域内,第三个 let 语句也隐藏了 x,将之前的值乘以 2,x 得到的值是 12。当该作用域结束时,内部 shadowing 的作用域也结束了,x 又返回到 6。运行这个程序
常量
Rust 对常量的命名约定是在单词之间使用全大写加下划线。编译器能够在编译时计算一组有限的操作,这使我们可以选择以更容易理解和验证的方式写出此值,而不是将此常量设置为值10,800。
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;