【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

Rust 新增存在类型支持

  • 2018-05-31
  • 本文字数:1093 字

    阅读完需:约 4 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

Rust 1.26 版本增加“存在类型(existential type)”支持、改进后的 match绑定、切片模式及一些实用的语法糖。Rust 编译器也变得更快了,并且支持 128 位整数了。

存在类型是通过impl Trait实现的。这使得开发人员可以指定函数的返回类型,而不必指出具体是哪一种类型。例如:

复制代码
fn foo() -> impl Trait {
// ...
}

在上述代码中,foo被声明为一个函数,它的返回类型实现了“特型(trait)”Trait,而不是具体的类型。这和下面的声明有些类似:

复制代码
fn foo() -> Box<Trait> {
// ...
}

不过,使用Box<Trait>意味着动态分配,我们并非总是希望或需要这样,而impl Trait确保了静态分配。这种方法使foo仅能返回同样的类型。此外,impl Trait语法的胶水代码更少,如下例所示:

复制代码
trait Trait {
fn method(&self);
}
impl Trait for i32 {
// 在这里实现
}
impl Trait for f32 {
// 在这里实现
}
fn new_foo() -> impl Trait {
5 // 我们可以仅返回一个 i32 类型的值
}
fn old_foo() -> Box<Trait> {
Box::new(5) as Box<Trait> // 这很繁琐
}

在定义返回闭包的函数时,新的impl Trait语法就格外亮眼了,它实现了特型Fn

复制代码
fn foo() -> impl Fn(i32) -> i32 {
|x| x + 1
}

impl Trait语法还可以用于替代泛型类型的声明,如下例所示,虽然在这种情况下,它定义了一个通用类型,而不是存在类型:

复制代码
// 之前
fn foo<T: Trait>(x: T) {
// 之后
fn foo(x: impl Trait) {

不管是对有经验的程序员而言,还是对 Rust 编程新手而言,另外一项改进都减轻了他们的工作,那就是更为智能的match绑定,它所需要的对编译器内部构件的了解少了。例如,下面的代码现在合法了:

复制代码
fn hello(arg: &Option<String>) {
match arg {
Some(name) => println!("Hello {}!", name),
None => println!("I don't know who you are."),
}
}

在 Rust 之前的版本中,你应该需要添加一些样板文件来满足编译器的需要,即使你的匹配意图很明确:

复制代码
match arg {
&Some(ref name) => println!("Hello {}!", name),
&None => println!("I don't know who you are."),
}
}

谈到匹配,Rust 1.26 还支持数组切片匹配,如下例所示:

复制代码
fn foo(s: &[u8]) {
match s {
[1, x] => "Starts with one and has 2 elements",
[a, b, c] => "Has three elements",
_ => "Everything else",
}
}

Rust 1.26 还提供了两个相对较小的特性,一个是从main返回Result,一个是定义闭区间,如1..=3

要了解 Rust 1.26 的所有新增特性,请查阅官方发布说明

查看英文原文 Rust Has Got Existential Types

2018-05-31 12:151588
用户头像

发布了 1008 篇内容, 共 374.7 次阅读, 收获喜欢 341 次。

关注

评论

发布
暂无评论
发现更多内容

JVM性能调优之内存优化与GC优化实战

Ayue、

JVM jvm调优 技术专题合集

浅谈Linux虚拟文件系统

lecury

Linux 文件系统 经验分享、

纯css实现117个Loading效果(下)

德育处主任

css3 大前端 纯CSS css特效

Flink 实践教程-进阶(1):维表关联

腾讯云大数据

flink 流计算 Oceanus

音视频学习合集

Fenngton

内容合集 签约计划第二季

给弟弟的信第2封|关于时间管理这件事

大菠萝

28天写作

如何在 ASP.NET Core 中重写 URL

喵叔

28天写作 12月日更

<<长津湖>> 有感

Tiger

28天写作

乔布斯家app下架上架杂记

张老蔫

28天写作

Linux内核技术分享

lecury

内容合集 签约计划第二季

Flink 实践教程-进阶(2):复杂格式数据抽取

腾讯云大数据

flink 流计算 Oceanus

操作系统:Linux下的防火墙

程序员架构进阶

Linux 操作系统 防火墙 Firewalld 12月日更

眼耳鼻舌身意,严肃地聊一聊元宇宙的“技术拼图”

脑极体

流处理引擎Flink:编程 - 程序结构

正向成长

升级【爸爸程序员】了?用Python给自己的宝贝下载200+绘本动画吧!

梦想橡皮擦

12月日更

音视频实战(1)- 音频质量关键指标之QoE

liuzhen007

签约计划第二季

全方位认识 JVM

Ayue、

内容合集 技术专题合集

浅谈Linux线程模型

lecury

Linux 线程 经验分享、

面试官说:你来设计一个短链接生成系统吧

秦怀杂货店

Java 系统架构 系统 短链接

Arthas阿里开源的Java诊断工具

Ayue、

JVM 技术专题合集

浅谈Linux Cgroups机制

lecury

Linux Cgroups 经验分享、

Git进阶(七): 打标签

No Silver Bullet

git 学习 12月日更

【Redis集群原理专题】分析一下相关的Redis集群模式下的脑裂问题!

洛神灬殇

redis 分布式系统脑裂 集群 脑裂 12月日更

自定义 View:绘制垂直正弦函数

Changing Lin

12月日更

Flink 实践教程-入门(9):Jar 作业开发

腾讯云大数据

flink 流计算 Oceanus

浅谈Linux进程模型

lecury

Linux 进程 经验

「架构实战营」模块一作业

Vincent

「架构实战营」

25个带有酷炫动画的创意404错误页面,快给你的网站换上吧(持续更新)

海拥(haiyong.site)

大前端 28天写作 404 签约计划第二季 12月日更

浅谈Linux内存管理

lecury

Linux 内存管理 经验分享、

域控安全之域渗透

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

MySQL探秘(四):InnoDB的磁盘文件及落盘机制

程序员历小冰

MySQL 文件读写 28天写作 12月日更

Rust新增存在类型支持_语言 & 开发_Sergio De Simone_InfoQ精选文章