我正在做 rustlings 練習,我試著用這個來制作一個大寫函式。但是加入部分不起作用。它說:
“該方法join存在于 struct Vec<char>,但其特征邊界不滿足以下特征邊界不滿足:
<[char] as Join<_>>::Output = _”
我不知道是什么意思。加入字符向量的正確方法是什么?
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("")
},
}
}
uj5u.com熱心網友回復:
要回答您的問題,從字符向量中獲取字串的最佳方法是迭代并收集:
let my_string = my_char_vec.iter().collect();
但是您的代碼中還有其他問題:
- 您正在使用第一個字符來檢查字串是否為空,然后您從迭代的其余部分構建一個字串,并使第一個字符替換該字串的第一個字符......丟失了這個字符初始 str 的第二個
- 你正在構建一個無用的 vec 并再次迭代。這些是您不需要的昂貴步驟
您可以通過修改代碼以直接從迭代寫入字串來解決這些問題:
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
}
請注意,您使用的是專用于 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() {
let first = first.to_uppercase();
for c in first {
string.push(c);
}
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
}
第二種方法可以用于零分配的可變字串。但是如果第一個字符不是一個位元組長,它就會恐慌。
uj5u.com熱心網友回復:
join該char型別不滿足的方法的回傳型別中有一個約束,因為它沒有靜態生命周期:
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)
},
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/362731.html
