gpt4 book ai didi

Rust:条件特征继承

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

例如,我想在 Rust 中为容器编写 trait:

trait Container: Default {
type ValueType;
}

但我也希望所有 Container 也可以 Cloned 只有当 Container::ValueType 可以是 Cloned:

// not Rust code
trait Container: Default + Clone if Self::ValueType: Clone {
type ValueType;
}

当然,我可以有条件地为具体容器本身实现 Clone trait:

struct MyVec<T> {}

impl<T: Clone> Clone for MyVec<T> {/**/}

或使用 derive(Clone),但我想表达我对 Container trait 的意图,而不是实现类型。

最佳答案

存在这种类似的语法:

trait Container: Default + Clone where Self::ValueType: Clone {
// ^^^^^
type ValueType;
}

但这不是有条件的,Container只能针对满足all约束的类型实现:DefaultClone,而 Self::ValueTypeClone


我不确定这是否有用。 Rust 特征约束是显式的,这意味着除非存在约束,否则您不能使用某些东西。所以无论如何你都必须将它们包含在约束中。

fn use_container<C: Container>(c: C)
where
C: Clone,
C::ValueType: Clone
{
let _ = c.clone();
let _ = c.get_element().clone();
}

不管怎样,你必须在具体类型上实现 Clone

如果您的目标只是表明 “对于 Container 的实现,如果元素是 Clone 那么容器应该是克隆”,惯用 Rust 中的流行模式是仅在需要时限制您需要的内容。 (即如果一个函数需要克隆容器,则限制在 C: Clone 上;如果一个函数只需要克隆一个元素,则限制在 C::ValueType: Clone 上) .

关于Rust:条件特征继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64958073/

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