是否可以从集合中获取一个值并对其应用一种仅接受 self 而不是 &self 的方法?

最小工作示例

我想写的是类似于:

use std::collections::HashMap;

fn get<B>(key: i32, h: HashMap<i32, Vec<(i32, B)>>) -> i32 where B: Into<i32> {
    let v: &Vec<(i32, B)> = h.get(&key).unwrap();
    let val: &B = v.first().unwrap().1;

    // Do something to be able to call into
    // I only need the value as read-only
    // Does B have to implement the Clone trait?
    return val.into();
}

我曾试图在编译器错误之后到处乱跑 mut 试图安抚编译器错误,但这是徒劳的,但这确实是一个傻瓜的差事。
use std::collections::HashMap;

fn get<B>(key: i32, mut h: HashMap<i32, Vec<(i32, B)>>) -> i32 where B: Into<i32> {
    let mut v: &Vec<(i32, B)> = h.get_mut(&key).unwrap();
    let ref mut val: B = v.first_mut().unwrap().1;
    return (*val).into();
}

这种事情甚至可能发生还是 B 必须实现 Clone 特性?

我也试过:
  • 不安全
  • 原始指针

  • 我没试过:
  • Box
  • 其他我没有遇到过的 Rust 结构,
    我提到这一点是为了明确说明我没有
    省略了我所知道的任何方法。
  • 最佳答案



    一般来说,不,不是没有将它从集合中删除。该集合拥有该值。使用 self 的方法想要在消耗所有权的同时转换项目,因此您必须转移所有权。

    克隆或复制项目会创建一个具有新所有权的新项目,然后您可以将其赋予该方法。

    在您的特定情况下,您几乎可以摆脱这个令人兴奋的 where 子句:

    where for<'a> &'a B: Into<i32>
    

    除了 From<&i32> 没有为 i32 实现。你可以写一个特性来做你想做的事:
    use std::collections::HashMap;
    
    trait RefInto<T> {
        fn into(&self) -> T;
    }
    
    impl RefInto<i32> for i32 {
        fn into(&self) -> i32 { *self }
    }
    
    fn get<B>(key: i32, h: HashMap<i32, Vec<(i32, B)>>) -> i32
        where B: RefInto<i32>
    {
        let v = h.get(&key).unwrap();
        let val = &v.first().unwrap().1;
    
        val.into()
    }
    
    // ----
    
    fn main() {
        let mut map = HashMap::new();
        map.insert(42, vec![(100, 200)]);
        let v = get(42, map);
        println!("{:?}", v);
    }
    

    或者,您可以使用 Borrow :
    use std::collections::HashMap;
    use std::borrow::Borrow;
    
    fn get<B>(key: i32, h: HashMap<i32, Vec<(i32, B)>>) -> i32
        where B: Borrow<i32>
    {
        let v = h.get(&key).unwrap();
        let val = &v.first().unwrap().1;
    
        *val.borrow()
    }
    

    关于rust - 在不使用 Clone 特性的情况下从集合中获取值(value),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35873497/

    10-16 09:04