尝试在 Rust 中修剪和小写我的字符串

Jon*_*an 4 string memory-management rust

我正在尝试修剪并小写我的字符串。

目前我有

use dialoguer::Input;
    
let input: String = Input::new()
    .with_prompt("Guess a 5 letter word")
    .interact_text()
    .unwrap(); 
let guess: &str = input.as_str(); // trim and lowercase
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其转换String为修剪后的小写字母&str,但某些功能仅打开&str,而其他功能仅打开String,因此我无法想出一个优雅的解决方案。

TL;DR:最终目标必须guess是修剪后的小写字母&str

rod*_*igo 13

Rust stdlib 不在于优雅,而在于正确性和效率。

\n

在您的特定情况下,trim()被定义为str::trim(&self) -> &str因为它总是返回原始字符串的子字符串,所以它不需要复制或分配新字符串,只需计算开始和结束,然后进行切片。

\n

但是to_lowercase()被定义为str::to_lowercase(&self) -> String因为它将每个字符更改为等效的小写字符,所以它必须分配并填充一个新的String.

\n

您可能会认为,如果您拥有该字符串,则可以将其就地更改为小写。但这通常不起作用,因为小写字母和大写字母之间不存在一对一的映射。想一想,例如\xc3\x9f <-> SS德语。

\n

当然,您可能知道您的字符串只有 ASCII 字符...如果是这样,您也可以使用str::make_ascii_lowercase(&mut self)它进行就地更改,但仅限于具有 1 对 1 映射的 ASCII 字符。

\n

因此,总而言之,更符合人体工程学的代码是修剪input并复制为拥有的小写字母:

\n
let guess : String = input.trim().to_lowercase();\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果您绝对想避免分配额外的字符串,但您确信只有 ASCII 字符才重要:

\n
let mut input = input; //you could also add the mut above\ninput.make_ascii_lowercase();\nlet guess: &str = input.trim();\n
Run Code Online (Sandbox Code Playgroud)\n