Rust 101

Helloworld

fn main() {
    println!("Hello, world!");
}

这里的!符号是指这是个宏,并不是直接的函数

编译

rustc main.rs

Cargo

包管理器

Bootstrap: cargo new xxx

Open Cargo.toml in your text editor of choice. It should look similar to the code in Listing 1-2. Filename: Cargo.toml

[package]
name = "hello_cargo"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
[dependencies]

一个非常诡异的格式,叫Tom’s Obvious, Minimal Language

编译:cargo build

运行:cargo run

有了这个,对于很多包来说,可以这样编译

git clone someurl.com/someproject
cd someproject
cargo build

Guessing Game

use std::io;
fn main() {
    println!("Guess the number!");
    println!("Please input your guess.");
    let mut guess = String::new(); // 这个new是构造函数
    io::stdin().read_line(&mut guess) // mut guess分开的,代表可变。
        .expect("Failed to read line"); // 返回是一个io::Result,必须用这个接住Err才能不warning。
    println!("You guessed: {}", guess); // placeholder like python
}

这里来到了Rust非常神奇的地方,所有的let默认就是const。这种方式有利有弊吧,想想某linter的const满天飞,似乎是let三个字母要短一些呢。

然后,String::new()这个代表新建一个String对象,双冒号是指static function。

最后,expect是一个用于Result后面链式处理的函数,会在出错的时候(往往是系统级)输出第一个参数的字符串。

let foo = 5; // immutable
let mut bar = 5; // mutable

传参的时候,带上&代表引用,带上mul代表可变,实现应该是完美拷贝,性能不是问题。

这个写完之后,我们给TOML加一行:

[dependencies]
rand = "0.3.14"

然后执行cargo update,把代码改成这样:

extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
    println!("Guess the number!");
    let secret_number = rand::thread_rng().gen_range(1, 101);
    loop {
        println!("Please input your guess.");
        let mut guess = String::new();
        io::stdin().read_line(&mut guess)
            .expect("Failed to read line");
        let guess: u32 = match guess.trim().parse() { // 这里有个神奇的地方,guess这个已经被声明过了,其实还可以再次声明...
            Ok(num) => num,
            Err(_) => continue,
        };
        println!("You guessed: {}", guess);
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }
    }
}