首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rust时间表和所有权的问题

Rust时间表和所有权的问题
EN

Stack Overflow用户
提问于 2019-05-25 23:12:37
回答 1查看 49关注 0票数 1

我正在尝试通过读取一个文件来创建一个哈希图。下面是我写的代码。问题是,我需要将subset_description持久化到下一次迭代,这样我就可以将其存储在hasmap中,然后最终返回hashmap。

代码语言:javascript
复制
fn myfunction(filename: &Path) -> io::Result<HashMap<&str, &str>> {
    let mut SIF = HashMap::new();
    let file = File::open(filename).unwrap();
    let mut subset_description = "";
    for line in BufReader::new(file).lines() {
        let thisline = line?;
        let line_split: Vec<&str> = thisline.split("=").collect();
        subset_description = if thisline.starts_with("a") {
            let subset_description = line_split[1].trim();
            subset_description
        } else {
            ""
        };
        let subset_ids = if thisline.starts_with("b") {
            let subset_ids = line_split[1].split(",");
            let subset_ids = subset_ids.map(|s| s.trim());
            subset_ids.collect()
        } else {
            Vec::new()
        };
        for k in subset_ids {
            SIF.insert(k, subset_description);
            println!("");
        }
        if thisline.starts_with("!dataset_table_begin") {
            break;
        }
    }
    Ok(SIF)
}

我收到以下错误,但无法解决此问题

代码语言:javascript
复制
error[E0515]: cannot return value referencing local variable `thisline`
  --> src/main.rs:73:5
   |
51 |         let line_split: Vec<&str> = thisline.split("=").collect();
   |                                     -------- `thisline` is borrowed here
...
73 |     Ok(SIF)
   |     ^^^^^^^ returns a value referencing data owned by the current function
EN

回答 1

Stack Overflow用户

发布于 2019-05-26 00:28:00

问题出在铁锈公司为你提供的担保上。问题的根源可以如下所示。您正在读取一个文件并将其内容操作到一个HashMap中,并且您正在尝试返回对您读取的数据的引用。但是通过返回一个引用,你需要保证文件中的字符串在以后不会改变,这是你自然不能做到的。

在Rust术语中,您一直试图返回对局部变量的引用,这些变量在函数的末尾被删除,这将有效地留下悬空的指针。以下是我所做的更改,尽管它们可能不是最有效的,但它们确实进行了编译。

代码语言:javascript
复制
fn myfunction(filename: &Path) -> io::Result<HashMap<String, String>> {
    let mut SIF = HashMap::new();
    let file = File::open(filename).unwrap();
    let mut subset_description = "";
    for line in BufReader::new(file).lines() {
        let thisline = line?;
        let line_split: Vec<String> = thisline.split("=").map(|s| s.to_string()).collect();
        subset_description = if thisline.starts_with("a") {
            let subset_description = line_split[1].trim();
            subset_description
        } else {
            ""
        };
        let subset_ids = if thisline.starts_with("b") {
            let subset_ids = line_split[1].split(",");
            let subset_ids = subset_ids.map(|s| s.trim());
            subset_ids.map(|s| s.to_string()).collect()
        } else {
            Vec::new()
        };
        for k in subset_ids {
            SIF.insert(k, subset_description.to_string());
            println!("");
        }
        if thisline.starts_with("!dataset_table_begin") {
            break;
        }
    }
    Ok(SIF)
}

正如您所看到的,现在您在返回值中放弃了字符串的所有权。这是通过修改返回类型并使用to_string()函数将本地字符串的所有权交给HashMap来实现的。

有一种观点认为to_string()很慢,所以您可以探索into或to_owned()的用法,但由于我不精通这些构造,所以无法帮助您进行优化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56306074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档