小能豆

我想实现Shl的特征Vec

rust

我想实现Shl的特征Vec,代码如下。这将使类似的事情成为vec << 4可能,这对 来说是很好的糖vec.push(4)

use std::ops::Shl;

impl<T> Shl<T> for Vec<T> {
    type Output = Vec<T>;

    fn shl(&self, elem: &T) -> Vec<T> {
        self.push(*elem);
        *self
    }
}

fn main() {
    let v = vec![1, 2, 3];
    v << 4;
}

编译失败并出现以下错误:

无法提供在此板条箱中未定义特征和类型的扩展实现 [E0117]

或者

类型参数T必须用作某些本地类型的类型参数(例如MyStruct<T>);类型参数只能实现当前包中定义的特征 [E0210]

据我了解,我必须修补 stdlib,更具体地说是collections::vec板条箱。有没有其他方法可以更改此代码以成功编译?


阅读 94

收藏
2024-05-21

共1个答案

小能豆

您不需要修改标准库来实现 Shl 特征对 Vec 的功能。问题在于 Shl 特征的实现要求接收者是 self 的引用,并且返回一个新的值,而 Vec::push 方法没有返回一个新的值,而是在原地修改了 Vec

您可以通过实现 Shl 特征来创建一个自定义的操作符,该操作符可以执行向 Vec 中添加元素的操作,并返回修改后的 Vec。这里是一种可能的解决方案:

use std::ops::Shl;

trait ShlVec<T> {
    fn shl_vec(self, elem: T) -> Self;
}

impl<T> ShlVec<T> for Vec<T> {
    fn shl_vec(mut self, elem: T) -> Self {
        self.push(elem);
        self
    }
}

fn main() {
    let v = vec![1, 2, 3];
    let v = v.shl_vec(4);
    println!("{:?}", v); // Output: [1, 2, 3, 4]
}

在这个示例中,我们定义了一个新的 trait ShlVec,它包含一个名为 shl_vec 的方法,该方法接收 self 的所有权,而不是 &self。然后,我们为 Vec<T> 实现了这个 trait,并在 shl_vec 方法中执行了 push 操作来添加元素。

2024-05-21