str 操作到现有的 Vec

str ops into existing Vec

Rust 中 str 上的大多数操作都会创建新分配的 String。我明白,因为 UTF8 很复杂,所以通常无法事先知道输出的大小,因此输出必须是可增长的。但是,我可能有自己的缓冲区,例如 Vec<u8> 我想增长。有没有办法指定一个现有的输出容器来进行字符串操作?

例如,

let s = "my string";
let s: Vec<u8> = Vec::with_capacity(100);  // explicit allocation
s.upper_into(s);  // perhaps new allocation here, if result fits in `v`

-编辑-

当然,这只是一种情况。我希望能够以这种方式处理所有 str 方法,包括例如 sentencecase 中的方法,而不必复制它们的内部逻辑。

您可以步行 char-by-char 并使用 char::to_uppercase():

let mut uppercase = String::with_capacity(100);
uppercase.extend(s.chars().flat_map(char::to_uppercase));

我认为它没有正确处理所有事情,但是 this is exactly what str::to_uppercase() does too,所以我认为它没问题。