【问题标题】:Ownership question (case with immutable and mutable borrow)所有权问题(不可变和可变借用的情况)
【发布时间】: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 上的书,并将知识应用于该代码(参见sbytes 及其生命周期之间的关系);在 Stack Overflow 中搜索编译器的错误消息以查看具有类似问题的问题。
  • 由于bytes 是对s 的可变引用,当bytes 存在时,您不能使用s
  • 感谢@E_net4ofthedownvotebrigade,我目前正在阅读这本书,并且正在进入Common Collection 一章,试图深入研究字符串结构,并挑战我对参考和借用的知识。我知道并完全理解,当现有的可变借用存在时,我无法创建不可变借用。我想根本问题是我不知道如何在文档doc.rust-lang.org/beta/std/primitive.str.html 中找到我想要的。

标签: utf-8 rust ownership


【解决方案1】:

您可以使用std::str::from_utf8&strbytes 打印为字符串。

【讨论】:

    猜你喜欢
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多