美文网首页RUST编程
Rust 编程视频教程(进阶)——027_2 高级特性 2

Rust 编程视频教程(进阶)——027_2 高级特性 2

作者: 令狐壹冲 | 来源:发表于2020-03-12 09:26 被阅读0次

视频地址

头条地址:https://www.ixigua.com/i6775861706447913485
B站地址:https://www.bilibili.com/video/av81202308/

源码地址

github地址:https://github.com/anonymousGiga/learn_rust

讲解内容

1、从不返回的never type
Rust 有一个叫做 ! 的特殊类型。在类型理论术语中,它被称为 empty type,因为它没有值。我们更倾向于称之为 never type。在函数不返回的时候充当返回值:

fn bar() -> ! { 
    // --snip--
}

例子1:
//Cargo.toml文件

[dependencies] rand = "0.6.0"

//src/main.rs

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() { 
            Ok(num) => num, 
            Err(_) => continue, //continue 的值是 !。
            //当 Rust 要计算 guess 的类型时,它查看这两个分支。
            //前者是 u32 值,而后者是 ! 值。
            //因为 ! 并没有一个值,Rust 决定 guess 的类型是 u32
            };      
            
        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; 
            } 
        } 
    } 
}

说明:never type 可以强转为任何其他类型。允许 match 的分支以 continue 结束是因为 continue 并不真正返回一个值;相反它把控制权交回上层循环,所以在 Err 的情况,事实上并未对 guess 赋值。

例子2:panic!
Option<T> 上的 unwrap 函数代码:

impl<T> Option<T> { 
    pub fn unwrap(self) -> T { 
        match self { 
            Some(val) => val, 
            None => panic!("called `Option::unwrap()` on a `None` value"),
        } 
    }
}

说明:
match 时,Rust 知道 val 是 T 类型,panic! 是 ! 类型,所以整个 match 表达式的结果是 T 类型。

相关文章

网友评论

    本文标题:Rust 编程视频教程(进阶)——027_2 高级特性 2

    本文链接:https://www.haomeiwen.com/subject/wezejhtx.html