如何使一个函数返回拥有字符串的哈希映射?

3
use std::collections::BTreeMap;

#[derive(Debug)]
struct TestStruct {
    name: String,
    num: f64,
}

fn main() {
    let test_struct = TestStruct {name: "Test".to_string(), num: 0.42 };
    println!("{:?}", test_struct);
}


fn get_fields_as_map(test_struct: &TestStruct) ->  BTreeMap<&str, &str> {
    let mut field_map: BTreeMap<&str, &str> = BTreeMap::new();
    field_map.insert("name", &test_struct.name);
    field_map.insert("num", &test_struct.num.to_string());
    field_map
}

Playground

这会产生以下错误:

error[E0515]: cannot return value referencing temporary value
  --> src/main.rs:19:5
   |
18 |     field_map.insert("num", &test_struct.num.to_string());
   |                              --------------------------- temporary value created here
19 |     field_map
   |     ^^^^^^^^^ returns a value referencing data owned by the current function

我认为这是有道理的。 to_string() 函数正在分配一个字符串,其生命周期与函数相同。 我还没有想出如何分配字符串,使其具有与 BTreeMap 相同的生命周期。 我尝试了几种不同的方法,但没有成功,感觉自己缺少了一些东西。 我不完全理解所有权。


1
我对所有权并不完全理解。”——我觉得最简单的方法就是问自己“谁决定何时分配应该释放?”在这种情况下,字符串只有在从映射中移除并且不再被使用后,才能被释放,所以映射应该拥有这个字符串(直到所有权转移给将其从映射中移除的人),而不仅仅是持有一个引用。通过将&...插入映射中,它只持有一个引用(指向一个在函数返回时被丢弃的字符串,从而导致映射中出现悬挂指针)。 - undefined
1个回答

7

如果您让map拥有其内部的字符串而不是存储引用,则可以避免麻烦。 引用意味着涉及生命周期,正如您发现的那样,构造具有所需生命周期的&str很难。

&str引用更改为拥有的String,生活就轻松了:

fn get_fields_as_map(test_struct: &TestStruct) ->  BTreeMap<String, String> {
    let mut field_map = BTreeMap::new();
    field_map.insert("name".to_owned(), test_struct.name.to_owned());
    field_map.insert("num".to_owned(), test_struct.num.to_string());
    field_map
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接