前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust每周一库】generic-array - 长度为范型的静态数组

【Rust每周一库】generic-array - 长度为范型的静态数组

作者头像
MikeLoveRust
发布2021-01-05 23:33:17
9430
发布2021-01-05 23:33:17
举报

今天是2021年的第一天,大家新的一年也要好好学习Rust呀~

在很多其他语言中,静态数组虽然是静态的,但是我们却可以“给它在运行时中指定一个动态的长度”。但在Rust中由于数组[T; N]中的N并不是范型,所以我们无法写出如下的代码:

代码语言:javascript
复制
struct Foo<N> {
	data: [i32; N]
}

今天我们介绍的generic-array库定义了trait ArrayLength<T>和结构体GenericArray<T, N: ArrayLength<T>>,这样我们就可以写出刚才我们想要的等价结构体了:

代码语言:javascript
复制
struct Foo<N: ArrayLength<i32>> {
	data: GenericArray<i32, N>
}

其中对于typenum库(一个范型的数值系统)中的无符号数,ArrayLength<T>有默认的实现,因此如果我们可以这样定义一个长度为5的数组

代码语言:javascript
复制
use generic_array::typenum::U5;

struct Foo<N: ArrayLength<i32>> {
    data: GenericArray<i32, N>
}

fn main() {
    let foo = Foo::<U5>{data: GenericArray::default()};
}

GenericArray<T, U5>基本上就和[T; 5]差不多

代码语言:javascript
复制
use generic_array::typenum::U5;

struct Foo<T, N: ArrayLength<T>> {
    data: GenericArray<T, N>
}

fn main() {
    let foo = Foo::<i32, U5>{data: GenericArray::default()};
}

如此一来我们就可以绕开Rust本身的限制,对静态数组的长度使用范型,让它动起来~不过其实Rust 2021发行版本据说就要原生支持这一功能了,大家也可以多多关注。结合本次介绍的generic-array的源代码跟一下这个事情~祝大家元旦快乐~

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-01,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com