22/06/27 21:57:27.41 TFU41qtv.net
>>987
Stringを自己trimするtrim_in_place()を対称的に短く書くなら
fn trim_in_place(s: &mut String, mut f: impl FnMut(char) -> bool) {
if let Some(end) = s.rfind(|c| !f(c)) {
let end = s.ceil_char_boundary(end + 1);
s.truncate(end);
}
if let Some(start) = s.find(|c| !f(c)) {
s.drain(..start);
}
}
たとえわずかでも先にendを処理
fは char::is_whitespace など
ただし目的外使用なので長くなるけど置き換え
s.drain(..start);
↓
s.replace_range(..start, "");
こちらはunstableなので長くなるけど置き換え
let end = s.ceil_char_boundary(end + 1);
↓
let end = ((end + 1)..).filter(|&i| s.is_char_boundary(i)).next().unwrap();
ここでendはrfind()で発見済なのでend + 1でunwrap()可能