Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Rust数组默认初始化:初始化未实现Copy trait的类型

Rust数组默认初始化:初始化未实现Copy trait的类型

作者头像
灯珑LoGin
发布于 2023-10-18 02:43:53
发布于 2023-10-18 02:43:53
4520
举报
文章被收录于专栏:龙进的专栏龙进的专栏

在安全的Rust中,编译器要求数组一旦被声明,它所占用的内存应当被完全初始化。但是,在一些情况下,这样会导致没法很灵活的对数组进行默认初始化。

问题

请看这个例子:

对于这样一个结构体,我们要初始化[Option<File>; FileDescriptorVec::PROCESS_MAX_FD]这个数组,想要把它的每个元素默认初始化为None。并且,由于其它的原因,我们不能够为File结构体实现Copy Trait.

如果我们使用这样的方式来把数组初始化为None:

就会报错:

报错的原因是,File结构体未实现Copy Trait,导致我们用None对Option<T>进行默认初始化的时候,编译器无法直接把Option<T>复制到数组的每个元素之中。

上文说到,由于其他原因的限制,我们不能为File实现Copy这个trait,因此,我们需要找别的方法,初始化这个数组。

解决方案:MaybeUninit

不安全的 Rust 给了我们一个强大的工具来处理这个问题:MaybeUninit。这个类型可以用来处理还没有完全初始化的内存。通过使用MaybeUninit,我们可以对一个数组进行逐个元素的初始化。

首先,我们声明一个MaybeUninit的类型的数组:

这个数组的元素类型就是MaybeUninit<Option<File>>,并且,在代码里面,我们通过assume_init()声称已经完全初始化了它。这听着不靠谱,但是,MaybeUninit本身就不需要初始化,因此,我们假设它已经初始化,是没有问题的。但是,请注意,这样会产生一个无效的类型实例(因为Option<File>实际上没有被初始化),并且会带来一些未定义的行为。

接着,我们在一个循环里面,初始化这个数组:

有的同学可能会疑惑:这样赋值不就导致了原先的”MaybeUninit”类型上面产生了一个drop了吗?

答案就是,MaybeUninit的类型,它的Drop Trait,产生的动作就是:“什么也不做”。也就是说,不会调用内层的类型的Drop方法。

在上面这段代码过后,整个数组都被初始化为None了,一切准备就绪,我们使用以下代码,把“未初始化”的类型,强制转换为“已经初始化”的类型:

于是,我们就能用这个data,去初始化FileDescriptorVec结构体了!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年3月8日20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
听GPT 讲Rust源代码--library/std(2)
在Rust源代码中,rust/library/std/src/sys_common/wtf8.rs这个文件的作用是实现了UTF-8编码和宽字符编码之间的转换,以及提供了一些处理和操作UTF-8编码的工具函数。
fliter
2023/10/25
1880
听GPT 讲Rust源代码--library/std(2)
听GPT 讲Rust源代码--src/tools(35)
在Rust源代码中的clippy_lints/src/transmute/mod.rs文件是Clippy工具的一部分,旨在提供有关transmute操作的静态代码分析。
fliter
2024/02/26
1630
Rust的Vec优化
但当100个enum类型的数据中,有80%都是8字节数据,如f64,剩下的20%才是24字节的Vec,那占得比例:
fliter
2023/12/04
2820
Rust的Vec优化
Rust 标记Trait,公共词汇Trait
科学无非就是在自然界的多样性中寻求统一性(或者更确切地说,是在我们经验的多样性中寻求统一性)。用 Coleridge 的话说,诗歌、绘画、艺术,同样是在多样性中寻求统一性。
草帽lufei
2024/06/07
1250
Rust 标记Trait,公共词汇Trait
听GPT 讲Rust源代码--compiler(12)
文件mod.rs位于Rust编译器源代码中的rustc_data_structures/src/graph/dominators目录下。这个文件的作用是实现支配树(dominator tree)的计算算法。
fliter
2024/03/18
1530
听GPT 讲Rust源代码--compiler(12)
听GPT 讲Rust源代码--src/tools(25)
在Rust源代码中,suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目录下,用于实现Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。
fliter
2024/01/12
1350
听GPT 讲Rust源代码--src/tools(25)
听GPT 讲Rust源代码--library/core/src(8)
在Rust源代码中,rust/library/core/src/future/ready.rs文件的作用是定义了一个名为Ready的Future类型。Ready是一个简单的Future实现,它立即返回一个给定的值。
fliter
2023/11/20
2000
听GPT 讲Rust源代码--library/core/src(8)
听GPT 讲Rust源代码--library/core/src(2)
题图来自 5 Ways Rust Programming Language Is Used[1]
fliter
2023/11/14
2380
听GPT 讲Rust源代码--library/core/src(2)
听GPT 讲Rust源代码--library/alloc
在Rust源代码中,rust/library/alloc/benches/slice.rs文件的作用是对&[T]类型(切片类型)进行性能基准测试。该文件包含了对切片类型的一系列操作的基准测试,例如切片迭代、切片排序、切片的iter和into_iter方法等。
fliter
2024/02/26
1610
听GPT 讲Rust源代码--library/alloc
听GPT 讲Rust源代码--library/core/src(6)
在Rust源代码中,rust/library/core/src/num/dec2flt/common.rs的作用是定义了一些用于十进制到浮点数转化的共享逻辑。以下是对该文件内容的详细介绍:
fliter
2023/11/18
2540
听GPT 讲Rust源代码--library/core/src(6)
听GPT 讲Rust源代码--library/core/src(7)
在Rust的源代码中,rust/library/core/src/ptr/metadata.rs 文件的作用是定义了与指针(ptr)和元数据(metadata)相关的结构体和 trait,提供了对指针的元数据信息进行操作和处理的功能。
fliter
2023/11/19
2240
听GPT 讲Rust源代码--library/core/src(7)
听GPT 讲Rust源代码--library/std(16)
题图来自 EVALUATION OF RUST USAGE IN SPACE APPLICATIONS BY DEVELOPING BSP AND RTOS TARGETING SAMV71[1]
fliter
2023/11/08
3220
听GPT 讲Rust源代码--library/std(16)
听GPT 讲Rust源代码--src/tools(30)
在Rust源代码中,cast_slice_from_raw_parts.rs文件位于rust/src/tools/clippy/clippy_lints/src/casts/目录下,它是Clippy工具中的一个lint,用于检查通过from_raw_parts函数将指针转换为切片时的潜在问题。
fliter
2024/01/21
1520
听GPT 讲Rust源代码--src/tools(30)
听GPT 讲Rust源代码--src/tools(32)
文件collapsible_calls.rs的作用是为Clippy提供了一个内部lint,该lint检查可能可以合并为一个链式调用的连续函数调用序列,并给出警告。
fliter
2024/01/27
1330
听GPT 讲Rust源代码--src/tools(32)
C/C++数组初始化的一些误区
直到十分钟前,我都以为这句代码确实能够将5个元素全部初始化为1,但事实跟我想的完全不同!(基础的东西革命的本钱,疏漏不得啊)
全栈程序员站长
2022/09/09
1.5K0
C/C++数组初始化的一些误区
听GPT 讲Rust源代码--src/tools(37)
在Rust源代码中,explicit_write.rs这个文件是Clippy的一个lint插件,其作用是检查代码中的write!、writeln!宏使用时的不当或繁琐的情况,并给出相关的警告或建议。
fliter
2024/02/26
1280
听GPT 讲Rust源代码--src/tools(37)
听GPT 讲Rust源代码--compiler(41)
在Rust的编译器源代码中,rust/compiler/rustc_borrowck/src/diagnostics/find_all_local_uses.rs文件的作用是为了在借用检查期间找到特定局部变量的所有使用。
fliter
2024/04/15
1230
听GPT 讲Rust源代码--compiler(41)
听GPT 讲Rust源代码--compiler(9)
在Rust源代码中,rust/compiler/rustc_trait_selection/src/traits/select/mod.rs文件的作用是实现Rust编译器的trait选择器。
fliter
2024/03/18
940
听GPT 讲Rust源代码--compiler(9)
听GPT 讲Rust源代码--compiler(10)
在Rust源代码中,instsimplify.rs这个文件的作用是实现一系列用于简化MIR(Mid-level Intermediate Representation,中间级中间表示)指令的转换器。
fliter
2024/03/18
1230
听GPT 讲Rust源代码--compiler(10)
听GPT 讲Rust源代码--compiler(38)
在Rust的源代码中,rust/compiler/rustc_parse/src/parser/expr.rs这个文件扮演了解析表达式的角色。表达式是Rust中的一种语法结构,用于表示程序中的计算、操作和值。
fliter
2024/04/15
1100
听GPT 讲Rust源代码--compiler(38)
相关推荐
听GPT 讲Rust源代码--library/std(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档