Gab*_*ado 4 string iterator char rust
我正在做沙沙声练习,我尝试用这个来制作大写函数。但连接部分不起作用。它说:
“该方法join存在于 struct Vec<char>,但不满足其特征边界,不满足以下特征边界:
<[char] as Join<_>>::Output = _”
我不知道这意味着什么。连接 char 向量的正确方法是什么?
pub fn capitalize_first(input: &str) -> String {
let mut c = input.chars();
match c.next() {
None => String::new(),
Some(first) => {
let upper = first.to_ascii_uppercase();
let mut v = c.collect::<Vec<char>>();
v[0] = upper;
v.join("")
},
}
}
Run Code Online (Sandbox Code Playgroud)
要回答您的问题,从 chars vec 获取字符串的最佳方法是迭代并收集:
let my_string = my_char_vec.iter().collect();
Run Code Online (Sandbox Code Playgroud)
但是您的代码中还存在其他问题:
您可以通过调整代码以直接将迭代写入字符串来解决这些问题:
let my_string = my_char_vec.iter().collect();
Run Code Online (Sandbox Code Playgroud)
请注意,您正在使用专用于 ASCII 字符的函数。当您确定只处理 ASCII 时,这很好,但如果您想要在国际环境中工作的东西,则需要使用更通用的to_uppercase. 由于unicode大写字符可能是多个字符,因此代码稍微复杂一些:
pub fn capitalize_first(input: &str) -> String {
let mut chars = input.chars();
let mut string = String::new();
if let Some(first) = chars.next() {
string.push(first.to_ascii_uppercase());
for c in chars {
string.push(c);
}
}
string
}
Run Code Online (Sandbox Code Playgroud)
如果您确定可以使用to_ascii_upercase,那么还有另一种解决方案。由于 ASCII 字符只是小写和大写的一个字节,因此您可以在 UTF8 字符串中就地更改它们:
pub fn capitalize_first(input: &str) -> String {
let mut chars = input.chars();
let mut string = String::new();
if let Some(first) = chars.next() {
let first = first.to_uppercase();
for c in first {
string.push(c);
}
for c in chars {
string.push(c);
}
}
string
}
Run Code Online (Sandbox Code Playgroud)
第二种方法可用于零分配的可变字符串。但如果第一个字符不是一个字节长,它就会出现恐慌。
| 归档时间: |
|
| 查看次数: |
5568 次 |
| 最近记录: |