try 运行以下代码时:

fn main() {
    let s1 = String::from("hello world");
    println!("The first word in the string is: {}", return_first_word(&s1));
}

fn return_first_word(s: &String) -> String {
    let t = s.split(" ");
    String::from(t.next().unwrap())
}

我在String::from(t.next().unwrap())行得到了错误cannot borrow as mutable.当然,当我将let t = ...行替换为let mut t = ...行时,代码工作得非常好.

我的问题是,有人能解释为什么吗?这里借了什么,借了什么?我判断了新创建的不可变变量t的类型,它是一个迭代器.为什么在迭代器上迭代会成为一个问题??

推荐答案

如果你熟悉Java这样的语言,你可能会期望str::split返回一个数组,但实际上不是.在Rust中,str::split返回一个迭代器.它实际上不会立即拆分整个字符串;它为您提供了一个特殊的迭代器对象,可以在您迭代字符串时执行此操作.

现在,迭代在Rust中是一个有状态的过程.要对某个对象进行迭代,可以调用Iterator::next,这会更改迭代器的内部状态并生成下一个值.如果反复调用,它会按顺序给出迭代器的每个值,然后开始生成None.由于next更改迭代器的状态,因此它必须具有对迭代器的可变引用.

当你声明一个let英寸的变量时,它是不可变的.你不能改变它.你已经告诉 rust 系统你无意改变它.所以,当你试图对promise 永远不会改变的东西(在你的例子中,是迭代器)进行可变引用时,Rust会抱怨.相反,你需要用let mut来表示你的意图.

Rust相关问答推荐

有条件默认实现

如何在tauri—leptos应用程序中监听后端值的变化?""

为什么复印是豆荚的一个重要特征?

从特征实现调用函数的Rust惯用方法

编译项目期间使用Cargo生成时出现rustc错误

在析构赋值中使用一些现有绑定

为什么这是&q;,而让&q;循环是无限循环?

如何导入crate-type=[";cdylib;]库?

如何点击()迭代器?

为昂贵的for循环制作筛子

字段类型为Boxed的 struct 的生存期必须超过static

可以为rust构建脚本编写单元测试吗?

通过异常从同步代码中产生yield 是如何工作的?

确保参数是编译时定义的字符串文字

如何从trait方法返回std :: iter :: Map?

Rust 程序中的内存泄漏

如果我不想运行析构函数,如何移出具有析构函数的 struct ?

如何异步记忆选项中的 struct 字段

如何用另一个变量向量置换 rust simd 向量?

返回 &str 但不是 String 时,borrow 时间比预期长