我試圖將替換String中的所有非字母數字字符,用_替換。到目前為止,我已經想出了如何做相反的事情:
fn main() {
let a = String::from("hello!") 。
println!("{}", sanitize(a)); // printts "_____!"
}
fn sanitize(check: String) -> String{
check.replace(char::is_alphanumeric, "_"/span>)
}
當我試圖在check.replace行中反轉Pattern時,我得到一個錯誤:
fn main() {
let a = String::from("hello!") 。
println!("{}", sanitize(a)); //應該列印 "hello_"。
}
fn sanitize(check: String) -> String {
check.replace(!char::is_alphanumeric, "_"/span>)
}
error[E0600]: cannot apply unary operator `! `到type `fn(char) ->/span> bool {char: :methods::<impl char>::is_alphanumeric}`。
--> src/main.rs:146:19?
|
146 | check.replace(!char::is_alphanumeric, "_")
| ^^^^^^^^^^^^^^^^^^^^^^ 不能應用單數運算子`!`。
顛倒這個Pattern的語法是什么,以便我可以替換非字母數字的字符?
我注意到在matches的檔案中,char::is_alphanumeric是一個有效的Pattern,因為它是 "一個確定一個字符是否匹配的函式或閉包"。我想,如果需要的話,我可以寫我自己的函式,但對該函式的寫法是否有限制?
uj5u.com熱心網友回復:
習慣的方法是使用一個閉包(除非你真的需要一個單獨的函式,在多個地方使用)。正如你在檔案中看到的,模式可以是 "一個函式或閉包",它與簽名FnMut(char) -> bool匹配。使用一個簡單地否定char::is_alphanumeric的閉包將看起來像這樣:
fn sanitize(檢查。String) -> String {
check.replace(|c| !char::is_alphanumeric(c), "_"/span>)
}
uj5u.com熱心網友回復:
似乎一個自定義函式可以用在任何需要Pattern的地方,只要它接受一個char作為它唯一的引數,并回傳一個bool。Doc:
impl<'a, F> Pattern< 'a> for F where?
F: FnMut(char) -> bool。
在我的案例中,我最終得到了以下結果:
fn main() {
let a = String::from("hello!") 。
println!("{}", sanitize(a)); //應該列印 "hello_"。
}
fn sanitize(check: String) -> String {
check.replace(evil_chars, "_"/span>)
}
fn evil_chars(c: char) -> bool {
!char::is_alphanumeric(c)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/324455.html
標籤:
