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];
<>用户输入可能是任何东西,所以这只是要考虑的事情。
操场链接:您应该更仔细地阅读文档:)可能的重复您应该更仔细地阅读文档:)可能的重复