Rust 我如何实现我不具备的特质';我不属于我不喜欢的类型';你不拥有吗?

Rust 我如何实现我不具备的特质';我不属于我不喜欢的类型';你不拥有吗?,rust,traits,Rust,Traits,我想为Vec实现Shl特性,代码如下。这会使事情变得像vec-vec{ 自推(*elem); *自我 } } fn main(){ 设v=vec![1,2,3]; v虽然您不能完全做到这一点,但通常的解决方法是将您想要的类型包装到您自己的类型中,并在其上实现trait use somecrate::FooType; use somecrate::BarTrait; struct MyType(FooType); impl BarTrait for MyType { fn bar(&a

我想为
Vec
实现
Shl
特性,代码如下。这会使事情变得像
vec-vec{
自推(*elem);
*自我
}
}
fn main(){
设v=vec![1,2,3];

v虽然您不能完全做到这一点,但通常的解决方法是将您想要的类型包装到您自己的类型中,并在其上实现trait

use somecrate::FooType;
use somecrate::BarTrait;

struct MyType(FooType);

impl BarTrait for MyType {
    fn bar(&self) {
        // use `self.0` here
    }
}

虽然您不能完全做到这一点,但通常的解决方法是将您想要的类型包装到您自己的类型中,并在该类型上实现trait

use somecrate::FooType;
use somecrate::BarTrait;

struct MyType(FooType);

impl BarTrait for MyType {
    fn bar(&self) {
        // use `self.0` here
    }
}
这会使事情变得像
vec

这将导致类似于
vec的事情这是设计上不可能的。这是设计上不可能的。附录:实现Deref特征以避免键入
.0。foo
每一次在2020年这仍然是一种有效的方法吗?@max yes.这是“限制”是使rust成为优秀语言的核心因素之一。因此,这在2020年仍然有效,并且在rust版本1中可能永远有效。附录:实现Deref特性以避免每次键入
.0.foo
这在2020年仍然是有效的方法吗?@max yes.这是“限制”是使rust成为优秀语言的核心因素之一。因此,这在2020年仍然有效,并且在rust版本1中可能永远有效。
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)
}
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
    }
}
fn main() {
    let mut v = BadVec(vec![1, 2, 3]);
    v = v << 4;
    v.truncate(2);
    assert_eq!(2, v.len());
}