gpt4 book ai didi

rust - 使用阴影方法名称在impl for trait中指定方法实现

转载 作者:行者123 更新时间:2023-12-03 11:42:55 26 4
gpt4 key购买 nike

给定以下trait + impl块,如何从std::vec::Vecget方法的实现中调用MyMapget方法?

trait MyMap<K, V> {
fn get(&self, key: &K) -> Option<&V>;
}

impl<V> MyMap<usize, V> for Vec<Option<V>> {
fn get(&self, key: &usize) -> Option<&V> {
match Vec::get(self, *key).expect("undersized map") {
None => None,
Some(v) => Some(&v),
}
}
}
Rust playground
我试过了:
  • 希望编译器可以根据我的类型进行推断,因为它们是不同的:self.get(*key).expect...这使编译器解决了MyMap的get并提示类型不匹配。
  • 限定类型名称:Vec::get(self, *key).expect...,它混淆了MyMap的get再次解析,与self.get
  • 的错误相同
  • 使用Fully qualified syntax:<Self as Vec>::get(self, *key).expect...,这会使编译器提示根本不存在get
  • 在impl块之外的fn中包装Vecget,它确实有效,但看起来很可疑,而且似乎是错误的解决方案。
  • 最佳答案

    向量的get()方法未直接在Vec上实现。相反,它是切片上的函数。因此,最简单的选择是首先取消对向量的引用,产生一个切片,然后在该切片上调用get():

    impl<V> MyMap<usize, V> for Vec<Option<V>> {
    fn get(&self, key: &usize) -> Option<&V> {
    match (**self).get(*key).expect("undersized map") {
    None => None,
    Some(v) => Some(&v),
    }
    }
    }
    由于 self的类型为 &Vec<...>,我们需要两次解除引用才能获取切片:
  • 通过取消引用一次,我们得到一个Vec<Opiton<V>>
  • 取消引用再次在向量上使用Deref实现,并生成[Option<V>]

  • 附带说明一下,可以使用 Option::as_ref()方法简化方法主体:
    fn get(&self, key: &usize) -> Option<&V> {
    (**self).get(*key).expect("undersized map").as_ref()
    }

    关于rust - 使用阴影方法名称在impl for trait中指定方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63280782/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com