其他分享
首页 > 其他分享> > RUST基础:类型推导

RUST基础:类型推导

作者:互联网

Rust基础入门书籍推荐《深入浅出RUST》

Rust的类型推导功能是十分强大的。它不仅可以从变量声明的当前语句中获取信息进行推导,而且还能通过上下文信息进行推导

1 fn main() {
2     let elem = 5u8;//没有明确的标出变量的类型,但是通过字面的后缀,编译器知道elem的类型为u8
3     let mut vec = Vec::new();//创建一个动态数组,数组内包含的是什么元素类型可以不写
4     vec.push(elem);//当调用push函数时,通过elem变量的类型,编译器就可以推导出vec的实际类型是Vec<u8>
5     println!("{:?}",vec);
6 }

输出结果为5。

我们甚至还可以只写一部分类型,剩下的部分让编译器去推导,比如下面的这个程序,我们只知道players变量是Vec动态数组类型,但是里面包含什么元素类型并不清楚,可以在尖括号中用下划线来代替:

1 fn main() {
2     let player_scores = [
3         ("Jack",20),("Jane",23),("Jill",18),("John",19),
4     ];
5     //players是动态数组,内部成员的类型没有指定,交给编译器自动推导
6     let players : Vec<_> = player_scores.iter().map(|&(player,_score)|{player}).collect();
7 
8     println!("{:?}",players);
9 }

自动类型推导和“动态类型系统”是两码事。Rust依然是静态类型的。一个变量的类型必须在编译阶段确定,且无法更改,只是某些时候不需要在源码中显示写出来而已。这只是编译器给我们提供的一个辅助工具。

Rust是只允许“局部变量/全局变量”实现类型推导,而函数签名等场景下是不允许的,这是故意这样设计的。这是因为局部变量只有局部的影响,全局变量必须当场景初始化,而函数签名具有全局性影响。函数签名如果使用自动类型推导,可能导致某个调用的地方使用方式发生变化,它的参数、返回值类型就发生了变化,进而导致远处另一个地方的编译错误,这是设计者不希望看到的情况。

标签:推导,Rust,编译器,let,vec,类型,RUST
来源: https://www.cnblogs.com/hdhx-lh/p/16607618.html