[英]How do I join a char vector in Rust
我正在做 rustlings 练习,我试过这个来使 function 大写。但是连接部分不起作用。 它说:
“方法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("")
},
}
}
你可以只使用as_str()
pub fn capitalize_first(input: &str) -> String {
let mut c = input.chars();
match c.next() {
None => String::new(),
Some(first) => first.to_uppercase().to_string() + c.as_str(),
}
}
join
方法的返回类型存在char
类型不满足的约束,因为它没有 static 生命周期:
pub fn join<Separator>(&self, sep: Separator) -> <Self as Join<Separator>>::Output
where
Self: Join<Separator>,
{
Join::join(self, sep)
}
您应该使用String::from_iter
代替:
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;
String::from_iter(v)
},
}
}
要回答您的问题,从 vec 字符中获取字符串的最佳方法是迭代并收集:
let my_string = my_char_vec.iter().collect();
但是您的代码中还有其他问题:
您可以通过调整代码直接从迭代写入字符串来解决这些问题:
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
}
但是当您使用to_ascii_upercase
时,还有另一种解决方案。 因为 ASCII 字符在小写和大写中具有相同的字节大小,所以您可以在 UTF8 字符串中就地更改它们:
pub fn capitalize_first(input: &str) -> String {
let mut string = input.to_string();
if !string.is_empty() {
string[..1].make_ascii_uppercase();
}
string
}
第二种方法可以用于零分配的可变字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.