rust .insert_str()依赖于字符串中的内容吗?

w8rqjzmb  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(113)

我不知道该如何表达我的问题,所以我会尽力解释。
我正在尝试使用Rust为一个在终端窗口中运行的程序编写UI。这个程序有两个标签,我的想法是画出标签的两边,得到该行的长度,减去2得到它们的名称的正确位置,然后插入名称,得到这样的结果:

╭────────╮╭───────────╮
│ Lingon ││ Blueberry │

不幸的是,我不能减法没有程序恐慌。如果我去掉减法,加上一个println!为了查看每个标签末尾的长度,它正确地打印了4和14,但在2和10处错误地插入了名称。如果我将“\u{2502}“改为“l“(小写L),它将“正确地”将它们分别放在第4位和第14位。
我尽可能地简化了原始代码,并在底部添加了一个rust playground链接。

fn main() {
    let tab_names = vec!["Lingon", "Blueberry"];
    let win_cols = 100;
    let mut tab_rows = vec![String::with_capacity(win_cols); 2];

    for name in tab_names {
        tab_rows[0].push_str("\u{256d}");
        tab_rows[0].push_str(&std::iter::repeat("\u{2500}").take(name.chars().count()+2).collect::<String>());
        tab_rows[0].push_str("\u{256e}");

        tab_rows[1].push_str("\u{2502}");
        tab_rows[1].push_str(&std::iter::repeat("\u{0020}").take(2).collect::<String>());
        tab_rows[1].push_str("\u{2502}");
        
        let name_placement = tab_rows[1].chars().count();
        println!("{}\r", name_placement);
        tab_rows[1].insert_str(name_placement, name)
    }
    for i in 0..tab_rows.len() {
        println!("{}\r", tab_rows[i]);
    }
}

Same code in Rust Playground

**当我在发帖前编辑我的问题时,我可能已经意识到问题是什么了。

我试图自己回答这个问题,但请注意,我不是一个程序员,可能只是让自己更大的傻瓜。如果知道答案的人能证实,我将不胜感激.

htrmnn0y

htrmnn0y1#

  • String* 是字符串,其中每个字符可以由多个字节表示。例如,我使用的' \u{2502} '(垂直线),由三个字节表示。
  • insert_str(n)* 方法在字节位置 n 插入字符串。

当我试图将一个 String 插入到一个字符内的字节位置时,程序死机了。

相关问题