Rust:条件特征继承

标签 rust traits

例如,我想在 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/

相关文章:

rust - 切片到固定大小的数组

rust - 如何在rust中快速创建指定大小的空文件

syntax - 有什么方法可以创建特定 FnMut 的别名吗?

methods - 如何为此Rust特征使用相同的默认实现

rust - 如何在 Rust 中存储对结构的 void* 引用?

rust - 强制在 Rust 中仅在给定类型大小上实现特征

rust - 如何在 Rust 中获取向量中的最小值?

rust - 如何在 Vector 上为我自己的结构实现 PartialEq?

scala - 做自己 : T => and this: T => have the same meaning when defining a trait?

enums - 如何在结构中拥有特征字段?