gpt4 book ai didi

pointers - Rust,Copy Trait 在使用泛型时不适用于类型

转载 作者:行者123 更新时间:2023-12-03 11:34:18 24 4
gpt4 key购买 nike

Rust 不会编译以下内容:

#[derive(Copy, Clone)]
struct WhateverStruct<T> {
field : T
}

trait WhateverStructTrait<T> {
fn to(self) -> WhateverStruct<T>;
}
impl<T> WhateverStructTrait<T> for *mut WhateverStruct<T> {
fn to(self) -> WhateverStruct<T> {
unsafe {* self }
}
}

fn test() {
let x = WhateverStruct { field : 7u32 };
let _y = x;
let _z = x;
println!("Copying is fine");
}

fn main() {
test();
}

它提示不安全{* self }部分说

*self has type WhateverStruct<T>, which does not implement the Copy trait

但是,很明显它确实实现了复制特性。测试函数没有错误。如果你改变 struct WhateverStruct<T> { field : T }进入 struct WhateverStruct { field : u32 }并删除 <T>从其余代码来看,一切都可以正常编译和运行。所以 Rust 不喜欢泛型。

在这里你可以在 Playground 上看到:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5d5c3a0f0e6e0153ec286ce38f0f3a2d

这是一个错误吗?有变通办法吗?

最佳答案

对于任何泛型类型 Foo<T>当你得出 CopyClone , 特征总是有 T一定是CopyClone分别。有时,尽管您实际上并不需要 T为整个结构实现这些特征是 CopyClone .

下面的结构就是一个例子。

#[derive(Copy, Clone)]
struct Foo<T> {
_marker: std::marker::PhantomData<T>,
}

如果我们查看派生生成的代码( cargo-expand 用于该目的),我们会得到类似于

use std::prelude::v1::*;
#[macro_use]
extern crate std;

struct Foo<T> {
_marker: std::marker::PhantomData<T>,
}

#[automatically_derived]
#[allow(unused_qualifications)]
impl<T: ::core::marker::Copy> ::core::marker::Copy for Foo<T> {}

#[automatically_derived]
#[allow(unused_qualifications)]
impl<T: ::core::clone::Clone> ::core::clone::Clone for Foo<T> {
#[inline]
fn clone(&self) -> Foo<T> {
match *self {
Foo {
_marker: ref __self_0_0,
} => Foo {
_marker: ::core::clone::Clone::clone(&(*__self_0_0)),
},
}
}
}

仅查看 Copy 的实现(并稍微清理一下)它是

impl<T: Copy> Copy for Foo<T> {}

所以即使Foo<T>不需要 T成为 Copy , 它无论如何都会限制它。

在这些情况下,您只需实现 CopyClone你自己。只要结构的实际字段是 Copy,就有一个相当简单的实现。 .

struct Foo<T> {
_marker: std::marker::PhantomData<T>,
}

impl<T> Copy for Foo<T> {}

impl<T> Clone for Foo<T> {
fn clone(&self) -> Self {
*self
}
}

关于pointers - Rust,Copy Trait 在使用泛型时不适用于类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60907129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com