Rust 为什么截断的字符串打印为空括号对?

Rust 为什么截断的字符串打印为空括号对?,rust,Rust,我有 最后一行告诉我 error[E0277]:未满足特征绑定“():std::fmt::Display” -->src/main.rs:15:47 | 15 | println!(“您的文本正确长度:{}”,正确的字符串长度); |^^^^^^^^^^^^^^^^^^^^ `()`无法使用默认格式设置程序进行格式设置;如果使用的是格式字符串,请尝试使用“:?” | =帮助:“(”未实现特性“std::fmt::Display”。”` =注意:std::fmt::Display::fmt所需`

我有

最后一行告诉我

error[E0277]:未满足特征绑定“():std::fmt::Display”
-->src/main.rs:15:47
|
15 | println!(“您的文本正确长度:{}”,正确的字符串长度);
|^^^^^^^^^^^^^^^^^^^^ `()`无法使用默认格式设置程序进行格式设置;如果使用的是格式字符串,请尝试使用“:?”
|
=帮助:“(”未实现特性“std::fmt::Display”。”`
=注意:std::fmt::Display::fmt所需`
我做错了什么?如果我使用
{:?}
,那么我得到的是
()
而不是格式化字符串。

如果有疑问,请转到-这是
字符串::truncate的函数签名:

use std::io;

fn main() {
    println!("CHAR COUNT");
    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect(
        "Failed to read line",
    );

    let string_length = guess.len() - 2;
    let correct_string_length = guess.truncate(string_length);

    println!("Your text: {}", guess);
    println!("Your texts wrong length is: {}", string_length);
    println!("Your texts correct length: {}", correct_string_length);
}
注意两件事:

  • 它将
    self
    作为
    &mut
  • 它没有返回值
从那以后,问题就变得非常清楚了-
truncate
不会返回新的被截断字符串,而是在适当的位置截断现有字符串

一开始这似乎有点不直观,但Rust API往往不会在内存中分配新对象,除非您明确要求它们分配新对象-如果您再也不打算使用
guess
,那么创建一个全新的
字符串
是不合适的。如果要创建截断的副本,则需要明确:

fn truncate(&mut self, new_len: usize)
或者,如果您只想引用现有字符串的一部分,您可以按照Ryan的回答进行操作。

如果有疑问,请转到-这是
string::truncate的函数签名:

use std::io;

fn main() {
    println!("CHAR COUNT");
    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect(
        "Failed to read line",
    );

    let string_length = guess.len() - 2;
    let correct_string_length = guess.truncate(string_length);

    println!("Your text: {}", guess);
    println!("Your texts wrong length is: {}", string_length);
    println!("Your texts correct length: {}", correct_string_length);
}
注意两件事:

  • 它将
    self
    作为
    &mut
  • 它没有返回值
从那以后,问题就变得非常清楚了-
truncate
不会返回新的被截断字符串,而是在适当的位置截断现有字符串

一开始这似乎有点不直观,但Rust API往往不会在内存中分配新对象,除非您明确要求它们分配新对象-如果您再也不打算使用
guess
,那么创建一个全新的
字符串
是不合适的。如果要创建截断的副本,则需要明确:

fn truncate(&mut self, new_len: usize)
或者,如果您只想引用现有字符串的一部分,您可以按照Ryan的回答执行。

截断
,这就是它返回
()
的原因。看起来您只是在寻找一个常规的非突变子字符串:

let truncated = guess.clone();
truncated.truncate(string_length);
截断
,这就是它返回
()
的原因。看起来您只是在寻找一个常规的非突变子字符串:

let truncated = guess.clone();
truncated.truncate(string_length);

只是为了恭维这里的其他答案

试图截断Rust中不在字符边界上的字符串将导致运行时死机

因此,尽管这一点现在起作用:

let correct_string_length = &guess[..string_length];
如果您试图截断具有更宽字符的字符串,则代码在运行时会死机。如果要截断用户输入,尤其如此。。谁知道会是什么。例如:

let correct_string_length = &guess[..string_length];
<>用户输入可能是任何东西,所以这只是要考虑的事情。


操场链接:

只是为了恭维这里的其他答案

试图截断Rust中不在字符边界上的字符串将导致运行时死机

因此,尽管这一点现在起作用:

let correct_string_length = &guess[..string_length];
如果您试图截断具有更宽字符的字符串,则代码在运行时会死机。如果要截断用户输入,尤其如此。。谁知道会是什么。例如:

let correct_string_length = &guess[..string_length];
<>用户输入可能是任何东西,所以这只是要考虑的事情。


操场链接:

您应该更仔细地阅读文档:)可能的重复您应该更仔细地阅读文档:)可能的重复