在使用 #![no_std] 时,我该如何派生 Copy?

3
我正在处理一个使用了#![no_std]的项目,我想能够派生出有用的特性,如CopyClone。我尝试在项目根目录和我实际想要使用的文件中添加pub use core::prelude::*;。然而,任何尝试#[derive(Copy)]都会导致以下错误:

错误:尝试实现不存在的特性std::marker::Copy

我不明白我做错了什么。尝试添加
use core::marker::Copy

这将产生以下结果:

错误:在此模块中已导入名为Copy的类型

2个回答

3

# [derive] 在 #! [no_std] 中无法使用。通过 pub mod std {pub use core :: *;} 可以解决这个问题,它会将所有的 ::std:: 替换为 ::core::,使您可以从 core 派生编译器认为在 std 中的特性。


这是期望的行为,还是有Rust的错误您可以链接吗? - Shepmaster
@Shepmaster,我认为这是因为derive只是AST转换,就像编译器插件所做的一样,因此它们必须在标识符中指定完整名称。在大多数程序中,默认链接的是std而不是core,因此它们使用::std。但是,我不知道是否有一个关于这个问题的公开票据。 - Vladimir Matveev
我也不确定,但IRC上有几个人提到过它。 - ragingSloth

3
您可以始终使用 impl 实现标记特征:
impl Copy for MyStruct {}

不过它只适用于标记特征(marker traits),Clone和其他类似的特征仍需要使用deriving


什么是标记特征,为什么不需要提供实际的实现? - ragingSloth
标记特征不包含方法,仅存在于为类型打上某些属性的目的。例如,“Copy”表示该类型可以自动复制;“Send”表示该类型可以跨任务边界发送等。由于它们没有方法可实现,因此它们的impl块为空。 - Vladimir Matveev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接