1 先上一段代码
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("Fail to read line"); // 不要漏掉mut
println!("You guessed: {}",guess);
}
golang有几点不同,在最后的列表有罗列出来
2 io::Result是一个枚举类型,如有Ok和Err,分别表示成功和失败。
3 crates.io是开发者用于分享各种各样开源Rust项目的网站
4 cargo update命令 用于升级依赖包
5 cargo doc --open命令会在本地构建一份所有依赖的文档
6 match表达式由数个分支(arm)组成,每个分支都包含一个用于匹配的模式(pattern),以及匹配成功后要执行的代码。Rust中的match结构及模式是一类非常强大的工具。
use std::io;
use rand::Rng;
use std::cmp::Ordering;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("Fail to read line");
println!("You guessed: {}",guess);
match guess.cmp(&secret_number) { // 注意这里用了引用
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
7 Rust允许使用同名的新变量来隐藏旧变量,即变量可以用关键字let 将它重新声明为新类型
let a = 12;
a = "bel"; // error,expected integer, found `&str`let b = 12;
let b = "abc"; // ok,let会将b重新声明为新类型
8 将字符串转化为u32整型
let guess: u32 = guess.trim().parse().expect("Please type a number!");
9 无限循环关键字loop
use std::io;
use rand::Rng;
use std::cmp::Ordering;fn main() {
.....
loop {
.....
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {println!("You win!");break;} // 答对,break退出loop
}
}
}
10 match的简单用法
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
注:与golang的语法比较
Golang | Rust | |
导入包 | 导入包用关键词import,如 import "fmt" | 导入包用关键词use,如 use std::io |
一行代码的结束 | 一行代码结束后,封号( ; )可写可不写。如果不写,编译器编译时会自动给补充 | 一行代码结束后,封号( ; )必须要写,不然会报错 |
声明变量 | 有多种声明,这里不介绍了,如 var a int,a := 12,var a int = 12 | 声明用关键词let,并且变量都默认不可变,如果希望变量可变,必须使用关键字mut。如 let a = 2 // a 是不可变 let mut b = 12 // b是可变 |
string | string变量声明很简单,如 var s string,s := "abc" | string变量是用String::new(),如 let guess = String::new() |
格式化输出 | 一般使用类似 "%s" , "%d"这些百分号组合,如fmt.Printf("a = %d , b = %d", a , b) | 跟Python一样使用大括号{ },如println!("a = {}, b = {}", a , b) |
包依赖 | 在go.mod文件里添加包的依赖 | 如果cargo生成的项目,在Cargo.toml文件里在dependencies底下添加相关的包名和版本号,如 [dependencies] rand = "0.3.14" |
字符串转整型 | int64,_ := strconv.ParseInt(str,10,64) | let guess: u32 = guess.trim().parse().expect("Please type a number!") |
比较大小 | if a > b { // big } else if a < b { // small } else { // equal } | rust相对会比较简洁 match a.cmp(&b) {
|
无限循环 | for { // run } | loop { // run } |