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.更好的编译器优化--这一直都是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设计原则:易读、极致优化、强大无比的编译器
本文来自博客园,作者:正在战斗中,转载请注明原文链接:https://www.cnblogs.com/lzfhope/p/18809814
浙公网安备 33010602011771号