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());
}