Rust权威指南 - 第2章 编写一个猜数游戏

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的语法比较

 GolangRust
导入包 导入包用关键词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是可变

stringstring变量声明很简单,如 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) {
        Ordering::Less => println!("Too small!"),
        Ordering::Greater => println!("Too big!"),
        Ordering::Equal => println!("You win!"),
 }

 

无限循环

for {

   // run

}

loop {

   // run

}

   

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值