rust学习二十.11、RUST高级类型之never(永不)类型

neverType是rust别出心裁,与众不同的再一次佐证.

当我看完有关资料的第一感觉就是:rust真操蛋,永不类型就是一个标记而已,有时候有用,而有时候就是一个干扰(实为不习惯)!

一、前言

rust的永不类型,已经明显表达其意图:永不继续

它的标识符号是一个感叹号 !

二、示例1

闲话少叙,直接上例子!

本例基本源于 https://kaisery.github.io/trpl-zh-cn/ch20-04-advanced-types.html

#[allow(unreachable_code)]
fn main() {
    // 示例1:在循环中正确使用 continue
    println!("示例1:解析数字");
    loop {
        let guess = "42";
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => {
                println!("成功解析数字:{}", num);
                num
            }
            Err(_) => {
                println!("解析失败,继续下一次循环");
                continue;
            }
        };
        println!("你猜的数字是:{}", guess);
        break; // 成功解析后退出循环
    }

    // 示例2:演示永不类型在错误处理中的应用
    println!("\n示例2:调用返回永不类型的函数");
    println!("准备调用操蛋()函数...");
    退出程序(); // 这行之后的代码永远不会执行
    操蛋(); // 这行之后的代码永远不会执行
    无限循环(); // 这行之后的代码永远不会执行
    // 这行代码永远不会被执行
    println!("这条消息永远不会被打印");
}

// 返回永不类型的函数示例1:通过panic实现
fn 操蛋() -> ! {
    panic!("永远不存在的值")
}

// 返回永不类型的函数示例2:通过无限循环实现
fn 无限循环() -> ! {
    loop {
        std::thread::sleep(std::time::Duration::from_secs(1));
        println!("永远循环中...");
    }
}

// 返回永不类型的函数示例3:通过进程退出实现
fn 退出程序() -> ! {
    std::process::exit(0);
}

输出结果:

在这个例子中,演示了永不类型的经典作用:

1.标识退出,永不返回.无论是panic!还是loop

三、其它疑问和示例2

自然,看了这个之后,根据以往的习惯我们会有这样的一些疑问:

1.如果希望一个函数永不返回,为什么不用类型java的void

问了下comate,得出结论如下:

  1. 更精确的类型表达
  2. 更好的编译器优化
  3. 更强大的静态分析能力
  4. 更清晰的代码意图
  5. 更优雅的错误处理模式

我认可其中几个重点:

1.更好的编译器优化--这一直都是rust的追求

2.更清晰的代码意图和更精确的类型表达

--

另外comate提示我返回类型()类似java的void,所以这里也稍微演示下()返回

fn main(){
    let me=foo();
    let you=fight();
}

fn foo() ->(){
    println!("清明时节雨纷纷,闲敲棋子落灯花");
}

fn  fight(){
    println!("少年易老学难成,一寸光阴不可轻");
}

看输出:

可以看出,其实所有的rust函数/方法都是有返回的,编译器并不会因为赋值而报错。

而在java等语言中,如果让一个变量赋予一个void函数,那么是会报告编译器错误的。

rust的这种处理方式,也是编程中常见的一个处理策略:为没有值(没有匹配值)赋予一个默认值,以便更容易编写阅读,并在某些情况下获得更高的执行效率。

例如设计一个数据库表student:

create table student(
   id identity(1,1) not null,
   name varchar(40) not null,
   sex  varchar(10) not null
)

那么在前端我们为性别(sex)设置可选列表的时候,通常会提供这样的:男、女、未知

这个好处显而易见:避免可能的错误,减少编码bug,计算机可以处理得更快。

 

而如果不这样做,也有相应的理由:节约空间,尤其数据量巨大的情况下。

 

四、小结

1.rust永不类型是一种标记,没有实际的值,可以看作是一个设计策略、哲学!

2.永不类型表示函数绝不返回--基本上就是要退出程序(除非有调用std::panic::catch_unwind,或者你就是要死循环)

3.永不类型作为一个标记,可以让编译器优化代码

4.永不类型作为一个标记,让函数更容易阅读,比()返回类型,更加明确,更容易让读者明白!

 

rust永不类型,体现了rust设计原则:易读、极致优化、强大无比的编译器

 

posted @ 2025-04-05 10:55  正在战斗中  阅读(65)  评论(0)    收藏  举报