微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何让函数返回拥有字符串的哈希映射?

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 具有相同的生命周期。我尝试了几种不同的方法但都没有成功,并且觉得我错过了一些东西。我不完全了解所有权。

解决方法

如果让地图拥有其中的字符串而不是存储引用,则可以避免头痛。引用意味着涉及生命周期,正如您发现的那样,很难构建具有所需生命周期的 &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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。