首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个可变的借款发生在同一条线上?

两个可变的借款发生在同一条线上?
EN

Stack Overflow用户
提问于 2016-12-19 16:39:41
回答 1查看 492关注 0票数 3

我试着用铁锈中的雪球树干机箱来阻止单词的向量。这应该很简单,但是借阅检查程序一直拒绝我的代码:

代码语言:javascript
复制
// Read user input
let input = stdin();
let mut stemmer = Stemmer::new("english").unwrap();
for line in input.lock().lines() {
    let line = line.unwrap();
    let mut query: Vec<_> = line.split_whitespace().collect();
    for t in &mut query {
        *t = stemmer.stem_str(t);
    }
    // …
}

code检查程序说,我在行stemmer中有两个可变的借用*t = stemmer.stem_str(t);,并拒绝了我的代码。(第80行是for line in input.lock().lines()块的末尾。)

代码语言:javascript
复制
57  18 error    E0499  cannot borrow `stemmer` as mutable more than once at a time (first mutable borrow occurs here) (rust-cargo)
57  18 error    E0499  cannot borrow `stemmer` as mutable more than once at a time (second mutable borrow occurs here) (rust-cargo)
80   5 info     E0499  first borrow ends here (rust-cargo)

如果我直接调用stem()方法,我就会得到一个String,但是我不能只调用as_str()并期望将所获得的&str分配给*t,因为long检查程序抱怨“借来的值没有足够长的寿命”。

代码语言:javascript
复制
57  18 error           borrowed value does not live long enough (temporary value created here) (rust-cargo)
57  18 info            consider using a `let` binding to increase its lifetime (rust-cargo)
57  42 info            temporary value only lives until here (rust-cargo)
80   5 info            temporary value needs to live until here (rust-cargo)

我不确定这是否与这个库的实现细节有关,但我真的觉得被困在这里了。我从来没有想过,要想得到一个输入向量会如此困难。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-19 16:57:03

来自stem_str

它返回的str引用只有在不再次调用stem或stem_str时才有效;因此,如果在作用域中有这样的引用,Rust的借款人检查器将不允许调用其中的一个。

据推测,这是因为词干机实现实际上有某种内部缓冲区,在这种缓冲区中,单词是在词干存储时存储的。

这就是为什么不能在保持对字符串的引用的同时两次调用stem_str的原因;这样做将使第一个字符串失效!

我不能只打电话给as_str()并期望将获得的&str分配给*t

编译器是,完全正确的再次。您正在尝试创建一个值,对其进行引用,存储引用,然后删除该值!这是一个内存漏洞,你做不到。

相反,收集一个String的向量:

代码语言:javascript
复制
for line in input.lock().lines() {
    let line = line.unwrap();
    let mut query: Vec<_> = line.split_whitespace()
        .map(|t| stemmer.stem(t))
        .collect();
}

我强烈建议阅读https://doc.rust-lang.org/stable/book/,了解引用是如何工作的,以及它们会防止什么。在进入任何复杂的所有权问题之前和期间都要这样做。这些章节具体如下:

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

https://stackoverflow.com/questions/41227212

复制
相关文章

相似问题

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