我想实现Shl的特征Vec,代码如下。这将使类似的事情成为vec << 4可能,这对 来说是很好的糖vec.push(4)。
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]
T
MyStruct<T>
据我了解,我必须修补 stdlib,更具体地说是collections::vec板条箱。有没有其他方法可以更改此代码以成功编译?
collections::vec
您不需要修改标准库来实现 Shl 特征对 Vec 的功能。问题在于 Shl 特征的实现要求接收者是 self 的引用,并且返回一个新的值,而 Vec::push 方法没有返回一个新的值,而是在原地修改了 Vec。
self
Vec::push
您可以通过实现 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 操作来添加元素。
ShlVec
shl_vec
&self
Vec<T>
push