gpt4 book ai didi

rust - 在不使用 Clone 特性的情况下从集合中获取值(value)

转载 作者:行者123 更新时间:2023-11-29 07:54:35 25 4
gpt4 key购买 nike

是否可以从集合中获取一个值并对其应用一种方法,该方法只接受 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 特性?

我也试过:

  • 不安全
  • 原始指针

我没试过:

  • 盒子
  • 我没有遇到的其他 Rust 构造,我提到这个是为了明确声明我没有省略了我所知道的任何方法。

最佳答案

Is it possible to get a value from a collection and apply a method to it which accepts only self and not &self?

一般来说,不,不是没有将其从集合中删除。集合拥有值(value)。采用 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/

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