首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这不算一成不变的借款呢?

为什么这不算一成不变的借款呢?
EN

Stack Overflow用户
提问于 2019-04-23 16:57:33
回答 1查看 72关注 0票数 3

我正在阅读官方生锈书,并查看4.3节中的清单4-8。

代码如下所示:

代码语言:javascript
运行
复制
fn first_word(s: &String) -> usize {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return i;
        }
    }

    s.len()
}

fn main() {
    let mut s = String::from("hello world");

    let word = first_word(&s);

    s.clear();
}

这一行:

代码语言:javascript
运行
复制
let word = first_word(&s);

似乎借用了对s的一个不变的引用。(我想这就是我错的地方,我只是不知道为什么。)

在下一行中,我们通过调用s方法来改变clear()

我原以为编译器会抛出:

代码语言:javascript
运行
复制
cannot borrow `s` as mutable because it is also borrowed as immutable

这为什么要编译呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-23 17:02:44

在调用s的过程中,字符串first_word是永久借用的。一旦控件在main之后返回给first_word,字符串就不再被认为是借来的,并且可以像您所观察到的那样发生变化。

如果first_word要返回一个&String,通过将它赋值给一个变量来延长它的生存期,那么您将看到所期望的错误。例如。

代码语言:javascript
运行
复制
fn first_word(s: &String) -> &String {
    &s
}

fn main() {
    let mut s = String::from("hello world");
    let word = first_word(&s);
    s.clear();
}

不能以可变的形式借用s,因为它也是不可变的。

https://rust.godbolt.org/z/cMVdVf

在这种情况下,添加一个额外的作用域可以解决这个问题:

代码语言:javascript
运行
复制
fn main() {
    let mut s = String::from("hello world");

    {
        let word = first_word(&s);
    }

    s.clear();
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55816067

复制
相关文章

相似问题

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