【发布时间】:2020-07-02 16:53:56
【问题描述】:
我有一个关于所有权的新手问题,我正在尝试在最后一个字节上更新 (+= 1) 并打印出 UTF-8 字符。 但是我对 String 有可变借用以更改最后一个字节,因此我无法打印它(使用不可变借用)。 Rustacean 的做法是什么?
注意:我知道我做得不好,我正处于学习阶段,谢谢。
fn main() {
let s = vec![240, 159, 140, 145];
let mut s = unsafe {
String::from_utf8_unchecked(s)
};
unsafe {
let bytes = s.as_bytes_mut(); // mutable borrow occurs here
for _ in 0..7 {
println!("{}", s); // Crash here as immutable borrow occurs here
bytes[3] += 1;
}
}
println!("{}", s);
}
【问题讨论】:
-
虽然我现在无法提供更多帮助,但一些提示:强烈建议您不要在仍在学习时使用
unsafe构造,一个小错误,您将度过一段非常糟糕的时光;可能值得重读References and Borrowing 上的书,并将知识应用于该代码(参见s和bytes及其生命周期之间的关系);在 Stack Overflow 中搜索编译器的错误消息以查看具有类似问题的问题。 -
由于
bytes是对s的可变引用,当bytes存在时,您不能使用s。 -
感谢@E_net4ofthedownvotebrigade,我目前正在阅读这本书,并且正在进入Common Collection 一章,试图深入研究字符串结构,并挑战我对参考和借用的知识。我知道并完全理解,当现有的可变借用存在时,我无法创建不可变借用。我想根本问题是我不知道如何在文档doc.rust-lang.org/beta/std/primitive.str.html 中找到我想要的。