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;
}
}
}
}