我最近才開始學習 Rust,并且一直在處理一些代碼。我想創建一個簡單的函式,從字串中洗掉元音并回傳一個新字串。下面的代碼起作用,但我擔心這是否真的是這種語言中有效的典型方法,或者我是否遺漏了什么......
// remove vowels by building a String using .contains() on a vowel array
fn remove_vowels(s: String) -> String {
let mut no_vowels: String = String::new();
for c in s.chars() {
if !['a', 'e', 'i', 'o', 'u'].contains(&c) {
no_vowels = &c.to_string();
}
}
return no_vowels;
}
首先,使用to_string()來構造一個新的字串,然后使用&來借用似乎不太合適。是否有更簡單的方法將字符附加到字串,或者這是唯一的方法?或者我應該完全重寫它并使用回圈的長度而不是字符陣列遍歷輸入的字串?
另外,我被告知在 Rust 中不使用 return 陳述句而是讓最后一個運算式從函式回傳值是非常流行的。這里是否需要我的 return 陳述句,或者是否有更簡潔的方法來回傳遵循約定的值?
uj5u.com熱心網友回復:
如果您String像示例一樣使用原件,則可以使用 就地洗掉元音retain(),這將避免分配新字串:
fn remove_vowels(mut s: String) -> String {
s.retain(|c| !['a', 'e', 'i', 'o', 'u'].contains(&c));
s
}
看到它在操場上作業。旁注:您可能還想考慮大寫元音。
uj5u.com熱心網友回復:
您可以使用collect字符迭代器來創建字串。您可以使用 過濾掉不需要的字符filter。
// remove vowels by building a String using .contains() on a vowel array
fn remove_vowels(s: &str) -> String {
s.chars()
.filter(|c| !['a', 'e', 'i', 'o', 'u'].contains(c))
.collect()
}
操場
如果這是在性能關鍵區域,那么由于您知道要洗掉的字符是 utf8 中的單個位元組,因此可以直接從位元組中洗掉。這意味著你可以寫一些類似的東西
fn remove_vowels(s: &str) -> String {
String::from_utf8(
s.bytes()
.filter(|c| ![b'a', b'e', b'i', b'o', b'u'].contains(c))
.collect()
).unwrap()
}
這可能更有效。操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/343573.html
上一篇:冒泡排序沒有排序
