[英]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.