我想做以下事情:
Vec某个键,并将其存储起来供以后使用.Vec则为该键创建一个空,但仍将其保留在变量中.如何有效地做到这一点?当然我以为我可以使用match:
use std::collections::HashMap;
// This code doesn't compile.
let mut map = HashMap::new();
let key = "foo";
let values: &Vec<isize> = match map.get(key) {
Some(v) => v,
None => {
let default: Vec<isize> = Vec::new();
map.insert(key, default);
&default
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试它时,它给了我错误,如:
error[E0502]: cannot borrow `map` as mutable because it is also borrowed as immutable
--> src/main.rs:11:13
|
7 | let values: &Vec<isize> = match map.get(key) {
| --- immutable borrow occurs …Run Code Online (Sandbox Code Playgroud) 我正在使用Rust编程语言学习Rust .我在处理闭包的章节中正在处理以下任务:
尝试修改
Cacher以保存哈希映射而不是单个值.哈希映射的键将arg是传入的值,并且哈希映射的值将是在该键上调用闭包的结果.值函数不会查看是否self.value直接具有值Some或None值,而是arg在哈希映射中查找并返回值(如果存在).如果它不存在,Cacher则将调用闭包并将结果值保存在与其arg值相关联的哈希映射中.
这是我的解决方案:
use std::collections::HashMap;
struct Cacher<T>
where
T: Fn(i32) -> i32,
{
calculation: T,
values: HashMap<i32, i32>,
}
impl<T> Cacher<T>
where
T: Fn(i32) -> i32,
{
fn new(calculation: T) -> Cacher<T> {
Cacher {
calculation,
values: HashMap::new(),
}
}
fn value(&mut self, arg: i32) -> i32 {
match self.values.get(&arg) {
Some(v) => *v,
None => { …Run Code Online (Sandbox Code Playgroud) 这个片段
use std::collections::HashMap;
struct Foo {
local_ids: HashMap<i32, i32>,
last_id: i32,
}
impl Foo {
fn foo(&mut self, external_id: i32) {
let id = self.local_ids
.entry(external_id)
.or_insert_with(||{self.last_id += 1; self.last_id});
}
}
Run Code Online (Sandbox Code Playgroud)
不行,因为我们不能两次借自己
error: closure requires unique access to `self` but `self.local_ids` is already borrowed [E0500]
Run Code Online (Sandbox Code Playgroud)
这可以在没有第二次密钥查找的情况下修复吗?
这与Rust:HashMap在尝试实现查找或插入时借用问题非常相似,但API已经发生了很大变化.
来自上面的find_with_or_insert_with回答似乎没有映射到当前的api.
我有一个简单的(我认为应该是)任务来处理mapa 中包含的值Vec并生成另一个Vec:
#[derive(Clone)]
struct Value(u32);
#[derive(Clone)]
struct Id(u32);
struct ValuesInfo {
values: Vec<Value>,
name: String,
id: Id
}
struct ValueInfo{
value: Value,
name: String,
id: Id
}
fn extend_values(v: Vec<ValuesInfo>) -> Vec<Vec<ValueInfo>> {
v.into_iter().map(|values_info|{
values_info.values.into_iter().map(|value|{
ValueInfo{
value,
name: values_info.name.clone(),
id: values_info.id.clone()
}
}).collect::<Vec<ValueInfo>>()
}).collect::<Vec<Vec<ValueInfo>>>()
}
Run Code Online (Sandbox Code Playgroud)
在这里我有一个部分移动错误看起来像
Compiling playground v0.0.1 (/playground)
error[E0382]: borrow of moved value: `values_info`
--> src/lib.rs:20:44
|
20 | values_info.values.into_iter().map(|value|{
| ----------- ^^^^^^^ value borrowed here after partial move
| | …Run Code Online (Sandbox Code Playgroud)