为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

对于我不拥有的类型,我如何实现我不拥有的特性?我想实现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箱子。是否有另一种方法可以将此代码更改为成功编译?
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

虽然你不能完全做到这一点,但通常的解决方法是将你想要的类型封装在你自己的类型中,并在此基础上实现这个特性。

use somecrate::FooType;use somecrate::BarTrait;struct MyType(FooType);impl BarTrait for MyType {
    fn bar(&self) {
        // use `self.0` here
    }}


查看完整回答
反对 回复 2019-07-04
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

这会使事情像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)}

如果你实现Deref (DerefMut):

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板条箱,它可以为你生成一些样板代码。


查看完整回答
反对 回复 2019-07-04
  • 2 回答
  • 0 关注
  • 479 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信