对于我不拥有的类型,我如何实现我不拥有的特性?

对于我不拥有的类型,我如何实现我不拥有的特性?

我想实现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;}

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

无法提供在此机箱中未定义特征和类型的扩展实现[E 0117]

类型参数T必须用作某些本地类型的类型参数(例如,MyStruct<T>);只有当前机箱中定义的特征才能对类型参数[E 0210]实现。

据我所知,我必须修补stdlib,更具体地说,collections::vec箱子。是否有另一种方法可以将此代码更改为成功编译?


有只小跳蛙
浏览 486回答 2
2回答

杨__羊羊

虽然你不能完全做到这一点,但通常的解决方法是将你想要的类型封装在你自己的类型中,并在此基础上实现这个特性。use&nbsp;somecrate::FooType;use&nbsp;somecrate::BarTrait;struct&nbsp;MyType(FooType);impl&nbsp;BarTrait&nbsp;for&nbsp;MyType&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;bar(&self)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;`self.0`&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;}}

慕虎7371278

这会使事情像vec << 4有可能,这是很好的糖vec.push(4).虽然这是可以做到的,但它通常是一个馊主意若要实现具有意外语义的运算符,请执行以下操作。下面是如何做到这一点的一个例子:use&nbsp;std::ops::Shl;struct&nbsp;BadVec<T>(Vec<T>);impl<T>&nbsp;Shl<T>&nbsp;for&nbsp;BadVec<T>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;Output&nbsp;=&nbsp;BadVec<T>; &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;shl(mut&nbsp;self,&nbsp;elem:&nbsp;T)&nbsp;->&nbsp;Self::Output&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.0.push(elem); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self &nbsp;&nbsp;&nbsp;&nbsp;}}fn&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;mut&nbsp;v&nbsp;=&nbsp;BadVec(vec![1,&nbsp;2,&nbsp;3]); &nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;v&nbsp;<<&nbsp;4; &nbsp;&nbsp;&nbsp;&nbsp;assert_eq!(vec![1,&nbsp;2,&nbsp;3,&nbsp;4],&nbsp;v.0)}如果你实现Deref&nbsp;(DerefMut):use&nbsp;std::ops::{Deref,&nbsp;DerefMut};impl<T>&nbsp;Deref&nbsp;for&nbsp;BadVec<T>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;Target&nbsp;=&nbsp;Vec<T>; &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;deref(&self)&nbsp;->&nbsp;&Self::Target&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&self.0 &nbsp;&nbsp;&nbsp;&nbsp;}}impl<T>&nbsp;DerefMut&nbsp;for&nbsp;BadVec<T>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;deref_mut(&mut&nbsp;self)&nbsp;->&nbsp;&mut&nbsp;Self::Target&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&mut&nbsp;self.0 &nbsp;&nbsp;&nbsp;&nbsp;}}你可以打电话Vec方法:fn&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;mut&nbsp;v&nbsp;=&nbsp;BadVec(vec![1,&nbsp;2,&nbsp;3]); &nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;v&nbsp;<<&nbsp;4; &nbsp;&nbsp;&nbsp;&nbsp;v.truncate(2); &nbsp;&nbsp;&nbsp;&nbsp;assert_eq!(2,&nbsp;v.len());}看一下newtype_derive板条箱,它可以为你生成一些样板代码。
打开App,查看更多内容
随时随地看视频慕课网APP