ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RUST基础:类型推导

2022-08-20 14:33:40  阅读:223  来源: 互联网

标签:推导 Rust 编译器 let vec 类型 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有