gpt4 book ai didi

rust - 如何在可变借用后打印出一个值?

转载 作者:行者123 更新时间:2023-11-29 08:15:13 41 4
gpt4 key购买 nike

我构造了一个字符串,然后借用它做一些修改。然后我想看看字符串是如何改变的,但我无法打印出值:

let mut s1 = String::from("hello");
let s2 = &mut s1;
s2.truncate(2);
print!("{}", s1);
println!("{}", s2);
error[E0502]: cannot borrow `s1` as immutable because it is also borrowed as mutable
--> src/lib.rs:5:18
|
3 | let s2 = &mut s1;
| ------- mutable borrow occurs here
4 | s2.truncate(2);
5 | print!("{}", s1);
| ^^ immutable borrow occurs here
6 | println!("{}", s2);
| -- mutable borrow later used here

我认为 Rust 中的借用类似于 C++,因此当 s1 更改时 s2 将相应更改。

最佳答案

Rust 的引用不像在 C/C++/Java 等其他语言中那样工作。 Rust 编译器在编译时确保内存安全,它通过使用“借用检查器”来实现。借用检查器遵守一组规则,而您发布的代码违反了其中一个规则。

这是一个直接quote来自解决这种确切情况的 Rust 书:

  • At any given time, you can have either one mutable reference or any number of immutable references.

首先,您创建一个可变变量 s1,并通过 s2 将其作为不可变变量借用。这很好,只要您没有同时使用它们。这里没有出现问题,因为您还没有真正对引用做任何事情。当您强制这两个引用同时处于事件状态时,就会出现问题。当您在 s2 超出范围(即最后一次使用之后)之前访问 s1 时,会发生这种情况。看看这个:

  let mut s1 = String::from("hello"); // -- Start of s1 scope --
let s2 = &mut s1; // -- Start of s2 scope --
s2.truncate(2); // s1 may not be used here as
// that breaks the rules
print!("{}", s1); // -- End of s1 scope --
println!("{}", s2); // -- End of s2 scope --

如您所见,由于代码的结构方式,s1s2 的作用域必须同时处于事件状态。如果您要交换最后两行代码,请将您的代码更改为:

  let mut s1 = String::from("hello"); // -- Start of s1 scope --
let s2 = &mut s1; // -- Start of s2 scope --
s2.truncate(2); // s1 may not be used here as
// that breaks the rules
println!("{}", s2); // -- End of s2 scope --
print!("{}", s1); // -- End of s1 scope --

然后您的代码将按预期编译和运行。原因是当 s2 的范围处于事件状态时,您根本没有使用 s1。换句话说,这些事情发生在上面代码的每一行:

  1. s1 拥有新创建的 String
  2. s2 可变地借用了 String
  3. s2 用于截断String
  4. s2 用于打印String。由于这是 s2 的最后一次使用,在这行之后 String 的所有权将返回到 s1
  5. s1 用于打印String

我希望这能为您澄清情况。

我建议您花时间看看 Rust 书的“理解所有权”一章 here .我的建议是从头开始阅读整本书。它会让您很好地理解 Rust 作为一种语言及其生态系统。

关于rust - 如何在可变借用后打印出一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58073069/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com