我如何实现我不拥有的types,我不拥有?

我想实现VecShl特性,代码如下。 这会使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; } 

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

不能提供一个扩展实现,在这个包中没有定义特征和types[E0117]

要么

types参数T必须用作某些本地types的types参数(例如MyStruct<T> ); 只有当前机箱中定义的特征才能用于types参数[E0210]

据我了解,我不得不修补stdlib,更具体的collections::vec箱子。 是否有另一种方法来更改此代码编译成功?

虽然你不能这样做,但通常的解决方法是只包装你想要的types,并在其上实现特性。

 use somecrate::FooType; use somecrate::BarTrait; struct MyType(FooType); impl BarTrait for MyType { fn bar(&self) { match *self { MyType(foo) => { .... } } } } 

这会使vec << 4可能,这将是vec.push(4)好糖。

虽然可以做到,但是用一个意想不到的语义实现一个操作符通常是一个坏主意 。

这是一个如何做到这一点的例子:

 use std::ops::Shl; struct BadVec<T>(Vec<T>); impl<T> Shl<T> for BadVec<T> { type Output = BadVec<T>; fn shl(mut self, elem: T) -> Self::Output { self.0.push(elem); self } } fn main() { let mut v = BadVec(vec![1, 2, 3]); v = v << 4; assert_eq!(vec![1, 2, 3, 4], v.0) } 

如果你实现DerefDerefMut ):

 use std::ops::{Deref, DerefMut}; impl<T> Deref for BadVec<T> { type Target = Vec<T>; fn deref(&self) -> &Self::Target { &self.0 } } impl<T> DerefMut for BadVec<T> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } 

你可以调用Vec方法:

 fn main() { let mut v = BadVec(vec![1, 2, 3]); v = v << 4; v.truncate(2); assert_eq!(2, v.len()); } 

看看newtype_derive箱子,它可以为你生成一些样板代码。