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