变量

使用变量储存值

  1. let a = 5;

在rust中,变量是默认不变的。创建一个a的变量并把它绑定到值5上。

使用mut 来使一个变量可变

  1. let apples = 5; // immutable
  2. let mut bananas = 5; // mutable
  1. let mut guess = String::new();

这一行创建了一个可变变量,当前它绑定到一个新的 String 空实例上。

  1. use std::io;

从标准库中引入了输入/输出功能。现在调用 io 库中的函数 stdin:

  1. io::stdin().read_line(&mut guess)
  2. .expect("Failed to read line");

read_line 的工作是接收用户在标准输入中输入的任何内容,并将其追加到一个字符串中(不覆盖其内容),因此它将该字符串作为参数。这个字符串参数需要是可变的,以便该方法可以通过添加用户输入来改变字符串的内容。

& 表示这个参数是一个 引用(reference),它允许多处代码访问同一处数据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的操纵引用。完成当前程序并不需要了解如此多细节。

如果 io::Result 实例的值是 Err,expect 会导致程序崩溃,并显示当做参数传递给 expect 的信息。如果 read_line 方法返回 Err,则可能是来源于底层操作系统错误的结果。如果 io::Result 实例的值是 Ok,expect 会获取 Ok 中的值并原样返回。在本例中,这个值是用户输入到标准输入中的字节数。

使用 println! 占位符打印值

  1. let x = 5;
  2. let y = 10;
  3. println!("x = {} and y = {}", x, y);

例子

  1. use std::io;
  2. fn main() {
  3. println!("Guess the number!");
  4. println!("Please input your guess.");
  5. let mut guess = String::new();
  6. io::stdin().read_line(&mut guess)
  7. .expect("Failed to read line");
  8. println!("You guessed: {}", guess);
  9. }

更新 crate 到一个新版本

  1. cargo update

生成随机数

  1. use std::io;
  2. use rand::Rng;
  3. fn main() {
  4. println!("Guess the number!");
  5. let secret_number = rand::thread_rng().gen_range(1..101);
  6. println!("The secret number is: {}", secret_number);
  7. println!("Please input your guess.");
  8. let mut guess = String::new();
  9. io::stdin()
  10. .read_line(&mut guess)
  11. .expect("Failed to read line");
  12. println!("You guessed: {}", guess);
  13. }

新增了一行 useuse rand::RngRng 是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。

rand::thread_rng 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接下来,调用随机数生成器的 gen_range 方法。这个方法由刚才引入到作用域的 Rng trait 定义。gen_range 方法接受一个范围表达式作为参数,并在该范围内生成一个随机数。我们在这里使用的范围表达式采用 start..end 形式,它包含下限但不包含上限,所以需要指定 1..101 来请求一个 1 和 100 之间的数。另外,我们也可以传递 1..=100,这是等价的。

运行 cargo doc --open 命令来构建所有本地依赖提供的文档,并在浏览器中打开。

隐藏变量

  1. fn main() {
  2. let x = 5;
  3. let x = x + 1;
  4. {
  5. let x = x * 2;
  6. println!("The value of x in the inner scope is: {}", x);
  7. }
  8. println!("The value of x is: {}", x);
  9. }

先将 x 绑定到值 5 上。接着通过 let x = 隐藏 x,获取初始值并加 1,这样 x 的值就变成 6 了。然后,在内部作用域内,第三个 let 语句也隐藏了 x,将之前的值乘以 2,x 得到的值是 12。当该作用域结束时,内部 shadowing 的作用域也结束了,x 又返回到 6。运行这个程序

常量

Rust 对常量的命名约定是在单词之间使用全大写加下划线。编译器能够在编译时计算一组有限的操作,这使我们可以选择以更容易理解和验证的方式写出此值,而不是将此常量设置为值10,800。

  1. const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;