/// Creates an iterator which uses a closure to determine if an element should be removed.
///
/// If the closure returns true, then the element is removed and yielded.
/// If the closure returns false, it will try again, and call the closure
/// on the next element, seeing if it passes the test.
///
/// Using this method is equivalent to the following code:
///
/// ```
/// # let mut some_predicate = |x: &mut i32| { *x == 2 };
/// # let mut vec = vec![1, 2, 3, 4, 5];
/// let mut i = 0;
/// while i != vec.len() {
/// if some_predicate(&mut vec[i]) {
/// let val = vec.remove(i);
/// // your code here
/// }
/// i += 1;
/// }
/// ```
///
/// But `drain_filter` is easier to use. `drain_filter` is also more efficient,
/// because it can backshift the elements of the array in bulk.
///
/// Note that `drain_filter` also lets you mutate ever element in the filter closure,
/// regardless of whether you choose to keep or remove it.
///
///
/// # Examples
///
/// Splitting an array into evens and odds, reusing the original allocation:
///
/// ```
/// let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
///
/// let evens = numbers.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
/// let odds = numbers;
///
/// assert_eq!(evens, vec![2, 4, 6, 8, 14]);
/// assert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
/// ```
fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<T, F>
where F: FnMut(&mut T) -> bool,
{ ... }
ăŠăăăŤĺéĄăăăă¨ćăăžăăăčŚă¤ăăăžăăă 誰ăăŞăżăŻăç§ăçăŁăŚăăăĺŽčŁ ăăăžăăă PRç俥ă
é˘éŁăăĺéĄďź
https://github.com/rust-lang/rust/issues/25477
https://github.com/rust-lang/rust/pull/34265
ăăśăăăăăŤăŻĺ°ćăŽćľăĺ°ăĺŤăăĺż čŚăŻăăăžăăăăçŻĺ˛ăăŠăĄăźăżăćă¤ăă¨ăă§ăăăŽă§ăć水玥ăŽăšăźăăźăťăăăŽăăăŤăŞăăžăă ăăăŤĺŻžăăćŹ çšăŻăăăžăăďź çŻĺ˛ăŽĺ˘çăă§ăăŻăčż˝ĺ ăăăă¨ăŻćŹ çšă ă¨ćăăžăăăăăăŻăŤăŞăĺŻč˝ć§ăăăăă1ă¤ăŽăă¨ă§ăă ăăăădrain_filterďź..ăfďźăŻă§ăăžăăă
čżăĺ°ćĽăăăăä˝ăăăŽĺ˝˘ă§ĺŽĺŽăăĺŻč˝ć§ăŻăăăžăăďź
ăłăłăă¤ăŠăĺ˘çăă§ăăŻăćé¤ăăăŽăŤĺĺ賢ăĺ ´ĺ
drain_filter(.., f)
ăŽĺ ´ĺăăăăé¸ćăăžăă
ďźăăăŚç§ăŻăăŞăăăăăăăćšćłă§ĺŽčŁ
ă§ăăă¨ăăŞă確俥ăăŚăăžă
ććŞăŽĺ ´ĺăăłăłăă¤ăŠăŻčł˘ăăŞăăžă
ăăŞăăăćŠč˝ăŽĺ°éĺăăćă¤ăă¨ăă§ăăĺ ´ĺă
ĺşćŹçăŤif Type::of::<R>() == Type::of::<RangeFull>() { dont;do;type;checks; return }
ăŽăăăŞăăŽďź
ăăăăăç¨ĺşŚăă¤ăŻăˇă§ăăă§ăăăă¨ăŻçĽăŁăŚăăžăăăăăă$ďź$ drain_where
drain_filter
ă¨ĺäťăăççąăŻä˝ă§ăăăďź ç§ăŤă¨ăŁăŚăĺč
ăŻVec
ĺ
¨ä˝ăćĺşăăăăă¨ăćĺłăăžăăăçľćăŤĺŻžăăŚfilter
ăĺŽčĄăăăă¨ăćĺłăăžăďźç§ăćĺăŤăăăčŚăă¨ăăç§ăŻćŹĄăŽăăăŤčăăžăăă .drain(..).filter()
ďź "ďźă ä¸ćšăĺč
ăŻăä˝ăăăŽćĄäťśăćçŤăăčŚç´ ăŽăżăćĺşăăăă¨ă示ăăŚăăžăă
ăăăăžăăăă drain_where
ăŽćšăăŻăăăŤĺŞăăŚăăăăŻăăăŤç´ćçă§ăă
ăăăĺ¤ć´ăăăăŁăłăšăŻăžă ăăăžăăďź
.remove_if
ăäşĺăŽććĄă§ă
drain_where
ăăăăćăăă誏ćăăŚăăă¨ćăăžăă ăăŹă¤ăłă¨ĺć§ăŤĺ¤ăčżăăžăăăăăšăŚăŽĺ¤ăăăŹă¤ăł/ĺé¤ăăăŽă§ăŻăŞăăçšĺŽăŽćĄäťśăçăŽĺ ´ĺăŤăŽăżĺ¤ăčżăăžăă
remove_if
ăŻăćĄäťśäťăăăźă¸ă§ăłăŽremove
ăŤăăäźźăŚăăžăăćĄäťśăçăŽĺ ´ĺăă¤ăłăăăŻăšăă¨ăŤ1ă¤ăŽă˘ă¤ăă ăĺé¤ăăžăăăă¨ăă°ă letters.remove_if(3, |n| n < 10);
ăŻăă¤ăłăăăŻăš3ăŽćĺă10ćŞćşăŽĺ ´ĺăŤĺé¤ăăžăă ă
ä¸ćšă drain_filter
ăŻĺ°ăăăăžăă§ăăă drain
ă揥ăŤfilter
ăăăćéŠĺăăăćšćłďźfilter_mapăŞăŠďźă§ĺŽčĄăăžăăă¤ăăŹăźăżfilter
ăŻćťăă
ăăăăăŞăăăăŁăŤăżăźăŻäťĽĺăŤčŤççăŤä˝żç¨ăăăăŽă§ă filtered_drain
ă¨ĺźă°ăăăšăă§ăŻăăăžăă...
ć¨ćşăŠă¤ăăŠăŞăŽăŠăă§ă_where
ăžăăŻ_if
ă使ç¨ăăĺäžăŻăăăžăăă
@GankroăŠăă§ă_filter
ă使ç¨ăăĺäžăŻăăăžăăďź ăžăăăăăăăăžăăăŽĺ°ăŞăç¨čŞă使ç¨ăăŞăççąă§ăăăăŠăăăăăăăžăăă ć¨ćşăŠă¤ăăŠăŞăŽäťăŽĺ ´ćă§ăŻăăă§ăŤ_until
ă_while
ăŞăŠăŽăăžăăžăŞăľăăŁăăŻăšă使ç¨ăăăŚăăžăă
ăłăĄăłăăŽăä¸č¨ăŽĺçăŽăăłăźăăŻćŁăăăăăžăă...ăăăăŽăłăźăăăľă¤ăă§iăă1ăĺźăĺż čŚăăăăžăăăăăăŞăă¨ăćŞăăă¨ă辡ăăăžăă
IMOĺéĄăŻfilter
ă§ăŻăăăžăăă ăăăć¤ç´˘ăăă°ăăďźăăăŚĺĺżč
ă§ăăďźă drain
ăŻäťăŽč¨čŞă¨ćŻčźăăŚăăŞăéć¨ćşăŽăăă§ăă
çš°ăčżăăŤăŞăăžăăăĺĺżč
ăŽčŚłçšăăăăă¨ăăăŽĺéĄăććĄăăăă¨ăĺŽčĄăăăăăŤä˝ăăčŚă¤ăăăă¨ăăă¨ă delete
ďź delete_if
ăŽăăăŤďźă remove
ăŞăăžăă ă filter
ăžăăŻreject
ă
ç§ăŻĺŽéăŤfilter
$ă_ć¤ç´˘_ăă drain_filter
ăčŚăŚăčŞăżăžăăă§ăă_ć¤ç´˘ăçśăăžăăă drain
ăŻăç§ăăăăăă¨ćăŁăŚăăĺç´ăŞăă¨ă襨ăăŚăăŞăăăă ăŁăăăă§ăă
filter
ăžăăŻreject
ă¨ăăĺĺăŽĺç´ăŞé˘ć°ăŽćšăăŻăăăŤç´ćçă§ăăăăăŤćăăăžăă
ĺĽăŽćł¨ćçšă¨ăăŚăăăăĺźăłĺşăăăăăŻăăŤăĺ¤ć´ăăĺż čŚăăăă¨ăŻćăăŞăă éŁéăé˛ăăžăă çćłçăŞăˇăăŞăŞă§ăŻă揥ăŽăăăŞăă¨ăă§ăăăăăŤăŞăăžăă
vec![
"",
"something",
a_variable,
function_call(),
"etc",
]
.reject(|i| { i.is_empty() })
.join("/")
çžĺ¨ăŽĺŽčŁ ă§ăŻăçľĺăăăăŽăŻćĺŚăăăĺ¤ă§ăă
accept
ă¨reject
ăŽä¸ĄćšăčŚăăăŽă§ăăă ăŠăĄăăĺ
ăŽĺ¤ăĺ¤ć´ăăžăăă
filter
ă ăă§éŁéăčĄăăă¨ăă§ăăžăă drain_filter
ăŽĺ
¨ä˝çăŞăă¤ăłăăŻăăăŻăăŤăĺ¤ć´ăăăă¨ă§ăă
@rpjohnstăŞăŽă§ăăăă§ć¤ç´˘ăăžăăăăăŠăăăŤfilter
ăăăăžăăăďź
ăŻăă Vec
Iterator
ăŽăĄăłăăźă§ăă
ăăŹă¤ăłăŻăăłăłăăăŤăŽăżéŠç¨ăăăRustăŽçŹŹ4ăŽç¨ŽéĄăŽćć樊ă襨ăăăăć°ăăç¨čŞă§ăăăäťăŽăťă¨ăăŠăŽč¨čŞă§ăŻä¸čŹăŤçĄćĺłăŞĺşĺĽă§ăďźç§ťĺăťăăłăăŁăŻăšăăŞăĺ ´ĺăĺ垊ă¨ĺé¤ăçľăżĺăăăŚĺä¸ăŽăă˘ăăăăŻăćä˝ďźă
ăă ăădrain_filterăŻăäťăŽč¨čŞăć°ăŤăăăšăăźăšăŤăăŹă¤ăłç¨čŞă秝ĺăăžăďźăăăŻăˇăăăŽĺéżăŻăăšăŚăŽč¨čŞăŤé˘éŁăăăăďźă
rust consume vec
ăŽă°ăźă°ăŤçľćă¨ăăŚăăăĽăĄăłăă§drain_filter
ăŤĺşăăăăžăăă ăăăŠăŤăă§ăŻrustăŽä¸ĺ¤ć§ăŽăăăfilterăŻăăźăżăćśč˛ťăăăăĄă˘ăŞăăăéŠĺăŤçŽĄçă§ăăăăăŤă˘ăăăźăăăćšćłăćăĺşăăŞăăŁăăă¨ăçĽăŁăŚăăžăă
drain_where
ăŻç´ ć´ăăăă§ăăăăŚăźăśăźădrain
ă¨filter
ăŽćŠč˝ăçĽăŁăŚăăéăăăăŽăĄă˝ăăăčż°čŞăăŁăŤăżăźăŤĺşăĽăăŚăăźăżăćĺşăăăă¨ăŻćăăă ă¨ćăăžăă
drain_filter
ăŻăăăăćĺşăăďźă¤ăžăă犺ăŤăŞăďźă揥ăŤăăŁăŤăżăŞăłă°ăăăăă¨ăćĺłăăŚăăăăăŤćăăžăă ä¸ćšă drain_where
ăŻăćĺŽăăăćĄäťśăćçŤăăčŚç´ ăćĺşăăăăăŤčăăăžăďźăăăŻććĄăăăé˘ć°ăčĄăăă¨ă§ăďźă
linked_list::DrainFilter
ăDrop
$ăĺŽčŁ
ăăŚăčż°čŞăŤä¸č´ăăćŽăăŽčŚç´ ăĺé¤ăăăšăă§ăŻăăăžăăăďź
ăŻă
ă¤ăăŹăźăżăăăăăăăă¨ăă¤ăăŹăźăżăćĺžăžă§ĺŽčĄăăăăŽăŻăŞăă§ăăďź ăăăŻă¤ăăŹăźăżăŤă¨ăŁăŚéŠăăšăĺä˝ă ă¨ćăăžăăĺż
čŚăŤĺżăăŚăć示çăŤĺŽčĄăăăă¨ăă§ăăžăă ä¸ćšăă¤ăăŹăźăżămem::forget
ĺŽčĄăăă¨ăŞăźăŻĺ˘ĺš
ăçşçăăăăăĺż
čŚăŞć°ăŽčŚç´ ă ăăĺăĺşăă¨ăăéăŻä¸ĺŻč˝ă§ăă
ç§ăŻăăŽé˘ć°ăé ťçšăŤä˝żç¨ăăŚăăăćĺşăăăă¨ăłăăŞăŤĺŻžăăŚĺ¸¸ăŤtrue
ăčżăăă¨ăĺżăăŞăă§ăă ăăăăăăŻă retain()
/ retain_mut()
ă¨ćŻčźăăŚç´ćăŤĺăăžăă
ç´ćçăŞčŤçăŹăăŤă§ăŻăäżćăăăă¨ăłăăŞăŤĺŻžăăŚtrue
ăčżăćšăçăŤăăŞăŁăŚăăžăăăäťăŽčŞ°ăăăăŽăăăŤćăăŚăăžăăďź ďźçšăŤretain()
ăăă§ăŤăăŽăăăŤćŠč˝ăăŚăăăă¨ăčăăă¨ďź
ăăăăăŚă drain_filter()
ăŽĺĺăretain_iter()
ăžăăŻretain_drain()
ďźăžăăŻdrain_retain()
ďźăŤĺ¤ć´ăăŚăżăžăăăďź
ăăăăă°ă retain()
ăăăĺłĺŻăŤĺć ăăăă¨ăŤăăŞăăžăă
ăăăç§ăĺĺăĺ¤ć´ăăăă¨ăććĄăăççąă§ă
drain_where
ăŻă揥ăŽăă¨ăćăăă§ăă
ăăŹă¤ăłăŽä¸ç¨ŽăŞăŽă§ăĺĺăŤăăŹă¤ăłă使ç¨ăăžă
where
ădrain
ă¨çľăżĺăăăŚä˝żç¨ââăăăă¨ăŤăăă
čŚç´ _where_čż°čŞătrueă§ăăĺ ´ĺăăăŹă¤ăłăăăžăăă¤ăžăăĺé¤ăăăŚčżăăăžăă
é常ăstdăŽäťăŽĺĺă¨ĺćăăŚăăĺ ´ĺăŻă
2ă¤ăŽčż°čŞă§ć§ćăăăé˘ć°ă使ç¨ăăŚďźĺ¤§ăžăăŤďźă¨ăăĽăŹăźăă§ăăžă
ăăăăŚăăŽĺžăăŽćšćłă§ĺčż°čŞă襨ăé˘ć°ă
filter_map
ăŻăďźĺ¤§ăžăăŤďź filter an then map
ă¨ăăŚă¨ăăĽăŹăźăă§ăăžăă çžĺ¨
ĺĺăŻăăădrain and then filter
ă§ăăăă¨ă示ăăŚăăžăăăăăăŤčżăăăăăăžăă
ĺŽĺ
¨ăŞăăŹă¤ăłăăžăŁăăčĄăăŞăăăă§ăă
2018ĺš´2ć25ćĽăćĽććĽăŽ17ďź [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
ç§ăŻăăŽé˘ć°ăé ťçšăŤä˝żç¨ăăŚăăă常ăŤčŚăăŚăăĺż čŚăăăăžă
ćĺşăăăă¨ăłăăŞăŤĺŻžăăŚtrueăčżăăžăă
hold_mutďźďźă¨ćŻčźăăŚç´ćăŤĺăăžăă
ăăŠă¤ăăŞăŹăăŤă§ăŻăă¨ăłăăŞIăŤĺŻžăăŚtrueăčżăćšăçăŤăăŞăŁăŚăăžăă
çśćăăăăäťăŽčŞ°ăăăăŽăăăŤćăăžăăďź
ăăăăăŚădrain_filterďźďźăŽĺĺăretain_filterďźďźăŤĺ¤ć´ăăŚăżăžăăăďźâ
ăăŽăšăŹăăăŤăľăăšăŻăŠă¤ăăăŚăăăăăăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/rust-lang/rust/issues/43244#issuecomment-368320990 ă
ăžăăŻăšăŹăăăăăĽăźăăăžă
https://github.com/notifications/unsubscribe-auth/AHR0kfwaNvz8YBwCE4BxDkeHgGxLvcWxks5tYYRxgaJpZM4OY1me
ă
ăă ăă drain_where()
ă使ç¨ăăă¨ăĺé¤ăăĺż
čŚăŽăăčŚç´ ăŤĺŻžăăŚăŻăăźă¸ăŁăźătrueăčżăĺż
čŚăăăăžăăăăăŻă retain()
ăŽĺ寞ă§ăăăä¸č˛Ťć§ăăăăžăăă
ĺ¤ĺretain_where
ďź
ăăăăĺĺăŤăăăŹă¤ăłăăĺŤăăăŽăŻçăŤăăŞăŁăŚăăă¨ćăăŽă§ă drain_retain()
ăćăçăŤăăŞăŁăŚăăă¨ćăăžăă$ drain()
ăŤäźźăŚăăžăăăăŻăăźă¸ăŁăźăćťăčŚç´ ăäżćăăžăă true
ă
ăăăŻĺ¤ăăăžăăăăăăŞăăçăčżăăŞăăă°ăŞăăŞăăă¨ăŻăăăćăăăŤăăžă
ăăŞăăŻăăăăŞăăă°ăŞăăžăăă
ç§ăŻĺäşşçăŤćŹĄăŽăăăăă使ç¨ăăžăďź
aă drain_where
bă retain_where
că retain
drain_retain
ăŻä˝żç¨ăăžăăă
ćć°´ăăŚäżćăăĺă税éĄăŽăăăťăšăŤă¤ăăŚčŠąăăžăăăĺ寞ăă
čŚçšăăăŹă¤ăłăŻăăŞăăĺé¤ăăďźăăăŚrăčżăďźäżćăăăăŽăŤă¤ăăŚčŠąăăžă
ăăŞăăäżćăăŚăăăăŽăŤă¤ăăŚčŠąăăžăďźăăăăă§ăŤstdă§ä˝żç¨ăăăŚăăćšćłă§ďźă
çžĺ¨ă retaim
ăŻăă§ăŤstdăŤĺŽčŁ
ăăăŚăăžăăă大ăăŞéăăăăăžă
drain
ăčŚç´ ăčżăăŚăăéăŤčŚç´ ăç ´ćŁăăŚăăăă¨ăă¤ăžă
retain
ďźć˛ăăăă¨ăŤďźĺĺăŤä˝żç¨ăăăŽăŻä¸éŠĺă§ăďźéťčŠąăăăăăĺ ´ĺăé¤ăďź
retain_and_return
ăžăăŻĺć§ăŽăăŽďźă
ăăŹă¤ăłăŤă¤ăăŚčŞăăă1ă¤ăŽăă¤ăłăăŻă秝čĄăŽĺŽšćăăă¤ăžă秝čĄăŽăăăăă§ăă
drain_where
ăŻăĺčŞăăźăšăŽć¤ç´˘ă¨ç˝ŽćăĺŽčĄăăăŽă¨ĺăăăăç°Ąĺă§ăă
ăłăźăăäżćăăăăăŤĺ¤ć´ăăĺ ´ĺăŻăăłăźăăăăăŤĺŚĺŽăăĺż
čŚăăăăžăă
使ç¨ăăăăăšăŚăŽčż°čŞ/ăăŁăŤăżăźé˘ć°ă
2018ĺš´2ć25ćĽăćĽććĽă18ďź [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
ăăăădrain_whereďźďźă使ç¨ăăă¨ăăŻăăźă¸ăŁăźăŻĺźăçśătrueăčżăĺż čŚăăăăžăă
ĺé¤ăăĺż čŚăŽăăčŚç´ ăăăăŻăretainďźďźăŽĺ寞ă§ăă
ä¸č˛Ťć§ăăŞăăŞăăžăă
ĺ¤ĺretain_whereďź
ăăăăĺĺăŤăăăŹă¤ăłăăĺŤăăăŽăŻçăŤăăŞăŁăŚăăă¨ćăăžăăă
ăăăăŁăŚădrain_retainďźďźăćăçăŤăăŞăŁăŚăăă¨ćăăžăăăăăŻdrainďźďźăŤäźźăŚăăžăăă
ăŻăăźă¸ăŁătrueăčżăčŚç´ ăäżćăăžăăâ
ăăŽăšăŹăăăŤăľăăšăŻăŠă¤ăăăŚăăăăăăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/rust-lang/rust/issues/43244#issuecomment-368325374 ă
ăžăăŻăšăŹăăăăăĽăźăăăžă
https://github.com/notifications/unsubscribe-auth/AHR0kfG4oZHxGfpOSK8DjXW3_2O1Eo3Rks5tYZHxgaJpZM4OY1me
ă
ăăăăăŠăŽăăăăŽé ťĺşŚă§drain()
ăădrain_filter()
秝čĄăăžăăďź
ăăăžă§ăŽăăšăŚăŽăąăźăšă§ăstdăŤretain_mut()
ăăŞăăčŚç´ ăĺ¤ć´ăăĺż
čŚăăăăăă retain()
ăădrain_filter()
ăŤç§ťčĄăăžăăăăăŽăăăăŻăăźă¸ăŁăŽćťăĺ¤ăĺ蝢ăăĺż
čŚăăăăžăăă
drain()
ăĄă˝ăăăŻçŻĺ˛ĺ
ăŽăăšăŚăŽčŚç´ ăçĄćĄäťśăŤćĺşăăăŽăŤĺŻžăă drain_retain()
ăŻăŻăăźă¸ăŁăźătrue
čżăčŚç´ ăäżćăăăăă drain_retain()
ăŻçăŤăăŞăŁăŚăăă¨ćăăžăă drain()
ăăăłretain()
ăĄă˝ăăăŽĺšćă
çłă訳ăăăžăăăă drain_filter
ăădrain_where
ăŤç§ťčĄăăă¤ăăă§ăă
retain
ă使ç¨ăăă˝ăŞăĽăźăˇă§ăłăăăă揥ăŤä˝żç¨ăăĺż
čŚăăăăă¨
drain_filter
ăŻăç§ăăžă ć¤č¨ăăŚăăŞăĺ´é˘ă§ăă
2018ĺš´2ć25ćĽăćĽććĽăŽ19ďź [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
ăăăăăŞădrainďźďźăădrain_filterďźďźăŤç§ťčĄăăăŽă§ăăăăďź
ăăăžă§ăŽăăšăŚăŽăąăźăšă§ăretainďźďźăădrain_filterďźďźăŤç§ťčĄăăžăă
stdăŤăŻretain_mutďźďźăăŞăăčŚç´ ăĺ¤ć´ăăĺż čŚăăăăăă§ăă
drainďźďźăĄă˝ăăăŻăăŹă¤ăłăăăŽă§ădrain_retainďźďźăŻçăŤăăŞăŁăŚăăă¨ćăăžă
çĄćĄäťśăŤçŻĺ˛ĺ ăŽăăšăŚăŽčŚç´ ăŤĺŻžăăŚădrain_retainďźďźăŻäżćăăžă
ăŻăăźă¸ăŁătrueăčżăčŚç´ ăâ
ăăŽăšăŹăăăŤăľăăšăŻăŠă¤ăăăŚăăăăăăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/rust-lang/rust/issues/43244#issuecomment-368330896 ă
ăžăăŻăšăŹăăăăăĽăźăăăžă
https://github.com/notifications/unsubscribe-auth/AHR0kSayIk_fbp5M0RsZW5pYs3hDICQIks5tYaJ0gaJpZM4OY1me
ă
ăăăăăă§ăăă drain_filter()
ă使ç¨ăăçžĺ¨ăŽăłăźăă§ăŻăăźă¸ăŁăĺ蝢ăăăäžĄć źăăŻăstdă§ä¸č˛Ťć§ăŽăăç´ćçăŞAPIăĺĺžăăŚăăăĺŽĺŽăăă䞥ĺ¤ăăăă¨ćăăžăă
ăăăŻăăăăŞĺşĺŽč˛ťăŤăăăžăăďźé˘ć°ăŽĺĺĺ¤ć´ăŤäź´ăăăăăłăłăă¤ăŠă¨ăŠăźăŤăăăăŻăăźă¸ăŁăĺ蝢ăăĺż
čŚăăăăă¨ăăŚăźăśăźăŤéçĽăăăĺŻč˝ć§ăăăăăăăă°ăçşçăăăă¨ăŻăăăžăăďźă ă drain_filter()
ăć¨ćşĺăăăłăšăă¨ćŻčźăăă¨ă retain()
ăădrain_filter()
ăŤç§ťčĄăăă¨ăăŻă常ăŤăŻăăźă¸ăŁăĺ蝢ăăĺż
čŚăăăăžăăăăăčĄăă¨ăăăăĽăĄăłăă§ăăăčŚă¤ăăăŽăéŁăăăăăăăŽăłăšăăŻă retain()
ăăćĽăŚăă retain()
ăŽăăăŞăăŽăć¤ç´˘ăăžăăă &mut
ăăăŽăŻăăźă¸ăŁăŤć¸ĄăăžăăăăŽăăăăăŽé˘ć°ăŽć°ăăĺĺăŽĺĺăŤăretainăăĺŤăžăăŚăăăŽăŻçăŤăăŞăŁăŚăăăŽă§ăăăăĽăĄăłăă§ć¤ç´˘ăăă¨ăăăăžăă
ăăă¤ăăŽäşäžăăźăżďźç§ăŽăłăźăă§ăŻă常ăŤdrain_filter()
ăŽretain_mut()
ă˘ăšăăŻăăŽăżăĺż
čŚă§ăăďźäťĽĺretain()
ă使ç¨ăăŚăăăă¨ăăăăăăžăăďźăĺż
čŚăŞăŚăźăšăąăźăšăŻăăăžăăă§ăăăćĺşăăăĺ¤ăĺŚçăăžăă ăăăŻĺ°ćĽăäťăŽäşşăŤă¨ăŁăŚăćăä¸čŹçăŞăŚăźăšăąăźăšăŤăŞăă¨ćăăžăďź retain()
ăŻ&mut
ăăŻăăźă¸ăŁăŤć¸ĄăăŞăăăă drain_filter()
ăŻăăŽăŚăźăšăąăźăšăăŤăăźăăĺż
čŚăăăăžăăăžăăćĺşăăăĺ¤ăĺŚçăăĺż
čŚăăăăăăä¸čŹçăŞăŚăźăšăąăźăšă§ăďźă
ç§ădrain_retain
ăŤĺ寞ăăççąăŻăçžĺ¨stdwrtă§ĺĺă使ç¨ăăăŚăăćšćłăŽăăă§ăă ăłăŹăŻăˇă§ăłďź
drain
ă collect
ă fold
ă all
ă take
ă..ă*_where
ă *_while
ăŞăŠăŽäżŽéŁžĺăĺŤăžăăĺ ´ĺăăăăžămap
ă filter
ă skip
ă...ďźmap
ă¨filter
/ skip
ďźfilter_map
apply modifier_1 and then apply modifier_2
ăŽćŚĺżľăćăŁăŚăăžăăăăăă1ă¤ăŽăšăăăă§ĺŽčĄăăćšăéŤéăžăăŻćčťă§ăăăăŞăăŻćă ćăŁăŚăăăăăăăžăăďź
drain_filter
ďźdrain_where
ďźăăŞăăŻé常ćăŁăŚăăžăăďź
take_collect
ăŽăăăŞčăăŻăăăžăăădrain_retain
ăŻăĄăăŁă¨ćĺłăăăăžăăăćĺžăŽăŤăă´ăŞăŤĺéĄăăăžăăăĺşćŹçăŤremove and return all elements "somehow specified" and then keep all elements "somehow specified" discarding other elements
ă¨čĄ¨ç¤şăăăŚăăăă¨ăŻć¨ć¸Źă§ăăžăă
ä¸ćšă retain_mut
ăăŞăăŻăăŽççąăăăăăžăăă modify
+ retain
ăçľăżĺăăăĺšççăŞćšćłă¨ăăŚretain_mut
ăç´šäťăăç°ĄĺăŞRFCăéăăăăăăžăăă retain
ç§ăŻăăăăăéăăăăăăŞăă¨ăăäşćăăăăžă
ăăŽĺžăăăŽćŠč˝ăĺŽĺŽăăăžăăă ăăăžă§ăŻăćĄĺźľăăŹă¤ăăćäžăăăă¨ăć¤č¨ă§ăăžă
iter_mut
+ bool-arrayďźăžăăŻbitarrayăăžăăŻ...ďźă使ç¨ăăŚ$ retain_mut
ăććăăăŠăŽčŚç´ ă追补ăăă
ĺăćťăĺż
čŚăăăăžăă ăžăăŻăĺ
é¨ă§drain_filer
/ drain_where
ă使ç¨ăăçŹčŞăŽdrain_retain
ăćäžăăžă
ăă ăăčż°čŞă|ele| !predicate(ele)
ă§ăŻăŞăăăŽăŤăŠăăăăžăă
@dathinab
*_where
ă使ç¨ăăăŽăŻăŠăŽćšćłă§ăăďźretain()
ă drain()
ăŞăŠďźă¨ćŻčźăăĺż
čŚăăăăžăă ăăă¤ăăŹăźăżăĺĽăŽă¤ăăŹăźăżăŤĺ¤ćăăă¤ăăŹăźăżăĄă˝ăăă¨ćˇˇĺăăăă¨ăŻăăăžăăădrain_filter()
ăŻăă§ăŤčż˝ĺ ăăăŚăăăäşşă
ăŻăăă使ç¨ăăăăăŤă˘ăăă¤ăšăăăŚăăăăă retain_mut()
ăŻstdăŤčż˝ĺ ăăăŞăă¨ăăăłăłăťăłăľăšăĺžăăăžăăă ăăăŤăăă retain()
ăădrain_filter()
ăŤç§ťčĄăăăŚăźăšăąăźăšăŤćťăăă¨ăé常ăŤä¸čŹçă§ăăăăăĺć§ăŽĺĺă¨APIă使ç¨ăăĺż
čŚăăăăžăďź true
ăčżăăŻăăźă¸ăŁăźăŻă¨ăłăăŞăäżćăăăă¨ăćĺłăăžăďźăăretain_mut
ăăă§ăŤč°čŤăăăŚăăăă¨ăŤć°ăĽăăŚăăžăăă
stdăŽä¸čŹçăŞĺ˝ĺăšăăźă ăŤă¤ăăŚä¸ťăŤwrtăŤă¤ăăŚčŠąăăŚăăžăă ăŤ
ăłăŹăŻăˇă§ăłăŤăŻăăĄă¤ăłăŽ1ă¤ă§ăăă¤ăăŹăźăżăĺŤăžăăžă
ăăłăăłăŹăŻăˇă§ăłăŽă˘ăŻăťăšćšćłăçšăŤăăăç´ăŽĺ ´ĺ
č¤ć°ăŽă¨ăłăăŞăĺ¤ć´ăăžăă
_where
ăŻăăăăăŤĺ¤ć´ăăăćĽĺ°žčžă襨ăăăăŽĺăŞăäžă§ă_until
ă _while
ă _then
ă _else
ă _mut
ă _back
ădrain_retain
ă桡䚹ăăŚăăççąăŻăăăă桡䚹ăăŚăăăŽăăŠăăăć確ă§ăŞăăăă§ăă
ăăŹă¤ăłăžăăŻäżćăăźăšăăăŹă¤ăłăăźăšăŽĺ ´ĺătrueăčżăă¨ĺé¤ăăăžă
ĺ¤ăŻăäżćăăźăšăŽĺ ´ĺăäżćăăăžăă _where
ă使ç¨ăăă¨ă
ćĺžăŤă渥ăăăé˘ć°ăŤä˝ăćĺž
ăăăăăć確ăŤăăžăă
2018ĺš´2ć26ćĽćććĽă00ďź [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
@dathinab https://github.com/dathinab
- ăăă§ăŻăă¤ăăŹăźăżă§ăŻăŞăăăłăŹăŻăˇă§ăłăŽăĄă˝ăăăŤă¤ăăŚčŞŹćăăŚăăžăă
mapăfilterăfilter_mapăskipătake_whileăŞăŠăŻăăšăŚIteratorăŽăĄă˝ăăă§ăă
ă¨ăăă§ă* _ whereă使ç¨ăăăŽăŻăŠăŽćšćłă§ăăďź
ăăăăŁăŚăĺ˝ĺăšăăźă ăć˘ĺăŽăĄă˝ăăă¨ćŻčźăăĺż čŚăăăăžă
ăłăŹăŻăˇă§ăłă§ăŻăretainďźďźădrainďźďźăŞăŠă ă¨ăŽćˇˇĺăŻăăăžăă
ă¤ăăŹăźăżăĺĽăŽă¤ăăŹăźăżăŤĺ¤ćăăă¤ăăŹăźăżăĄă˝ăăă- ăłăłăťăłăľăšăŻăretain_mutďźďźăstdăŤčż˝ĺ ăăăŞăă¨ăăăă¨ă§ăăă
ăŞăăŞăădrain_filterďźďźăŻăă§ăŤčż˝ĺ ăăăŚăăăäşşă ăŤă˘ăăă¤ăšăăăŚăăăăă§ăă
ăăă使ç¨ăăžăă ăăăŤăăăăăăŽç§ťčĄăŽăŚăźăšăąăźăšăŤćťăăžăă
é常ăŤä¸čŹçă§ăăăăăretainďźďźăădrain_filterďźďźăžă§ă
ĺć§ăŽĺĺă¨APIďźtrueăčżăăŻăăźă¸ăŁăźăŻă¨ăłăăŞăäżćăăăă¨ăćĺłăăžăďźăâ
ăăŞăăč¨ĺăăăăŽă§ăăăŞăăŻăăăĺăĺăŁăŚăăžăăăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/rust-lang/rust/issues/43244#issuecomment-368355110 ă
ăžăăŻăšăŹăăăăăĽăźăăăžă
https://github.com/notifications/unsubscribe-auth/AHR0kfkRAZ5OtLFZ-SciAmjHDEXdgp-0ks5tYevegaJpZM4OY1me
ă
ç§ăŻăăŽé˘ć°ăé ťçšăŤä˝żç¨ăăŚăăăćĺşăăăă¨ăłăăŞăŤĺŻžăăŚĺ¸¸ăŤtrueăčżăăă¨ăĺżăăŞăă§ăă ăăăăăăŻăretainďźďź/ retain_mutďźďźă¨ćŻčźăăŚç´ćăŤĺăăŚăăăăăŤćăăžăă
FWIWăăăă§ăŻretain
ăç´ćăŤĺăăĺĺă ă¨ćăăžăăç§ăŻé常ăăăŻăăŤăăçšĺŽăŽčŚç´ ăĺé¤ăăăă¨ćăŁăŚăăžăă retain
ă使ç¨ăăă¨ă常ăŤăăŽăă¸ăăŻăĺ蝢ăăĺż
čŚăăăăžăă
ăăăă retain()
ăŻăă§ăŤĺŽĺŽăăŚăăăŽă§ăăăă¨ä¸çˇăŤćŽăăĺż
čŚăăăăžăăăăăŚăç§ăŽç´ćăŻăăăŤć
Łăăžăăă
@Boscop ďź drain
ăĺć§ă§ăăăăăŻ$ďź retain
ăŽéă§ăăăĺé¤ăăăčŚç´ ă¨ă _until
ă _while
ăŞăŠăŽăľăăŁăăŻăšăŽä˝żç¨ćłăčżăăžăăć˘ĺăŽćŠč˝ăŽăăăăŤĺ¤ć´ăăăăăźă¸ă§ăłă§ăăĺŠç¨ĺŻč˝ăŞćŠč˝ă
ă¤ăžăăăăŹă¤ăłăŤă¤ăăŚčŞŹćăăă¨ă揥ăŽăăăŤăŞăăžăă
_ăä˝ăăăŽćšćłă§ăćĺŽăăăăăšăŚăŽčŚç´ ăĺé¤ăăŚčżăăäťăŽăăšăŚăŽčŚç´ ăäżćăăžă_
ăăă§ă_ "ä˝ăăăŽćšćłă§" _ăŻăăăšăŚăŽăšăŠă¤ăšĺŻč˝ăŞăłăŹăŻăˇă§ăłăżă¤ăăŽĺ ´ĺăŻ_ "ăšăŠă¤ăš" _ă§ăăăćŽăăŽĺ ´ĺăŻ_ "ăăšăŚ" _ă§ăă
ăăă§čŞŹćăăé˘ć°ăŽčŞŹćăŻă揥ăŽçšăé¤ăăŚ_ĺă_ă§ăă
_ "ä˝ăăăŽćšćłă§" _ is _ "ăăă§ăćĺŽăăăčż°čŞăŻtrue" _ăčżăăžăă
ä¸ćšăç§ăäżćăă誏ćăŻćŹĄăŽă¨ăăă§ăă
_ćĺŽăăăčż°čŞătrueăčżăčŚç´ ăŽăżăäżćďźă¤ăžăäżćďźăăćŽăăç ´ćŁăăžă_
ďźăŻăăretainăŻćŽăăç ´ćŁăăŞăćšćłă§ä˝żç¨ăăăĺŻč˝ć§ăăăăžăăăćŽĺżľăŞăăăăă§ăŻăăăžăăă§ăăďź
retain
ăăăă°ćŹĺ˝ăŤčŻăăŁăă¨ćăăžă
&mut T
ăčż°čŞăŤć¸Ąăăĺé¤ăăăĺ¤ăčżăăĺŻč˝ć§ăăăăžăă
retain
ăŽćšăç´ćçăŞĺĺăăźăšă ă¨ćăăăă§ăă
ăăăăăăă¨ăŻĺĽăŤă drain_filter
/ drain_retain
ăŻăŠăĄăăćéŠă§ăŻăŞăă¨ćăăžă
čż°čŞăă¨ăłăăŞăäżć/ćĺşăăăăăŤtrue / falseăčżăĺż
čŚăăăăăŠăăăć確ăŤăăŞăăăă
ďźăăŹă¤ăłăŻăăăŁăŤăżăźä¸ăŤčŚç´ ăĺé¤ăăăă¨ăŤă¤ăăŚčŞŹćăăŚăăăăătrueăĺé¤ăăăă¨ă示ăăžă
ăăăŚĺč¨çˇ´ăŻăćĺžăŤéăłăçść
ă§çśćăăčŚç´ ăŤă¤ăăŚčŠąăăžăďź
çľĺąăăŠăŽĺĺă使ç¨ăăăăŻéčŚă§ăŻăăăžăăăĺŽĺŽăăăăŽăăăă°ăăăŽă§ăăă
ä¸čŤčŞżćťăčĄăăă¨ăăăăł/ăžăăŻč¨čŞăăźă ăŽčŞ°ăăŤćąşĺŽăăăăă¨ăŻăčăăĺé˛ăăăăăăŽćčŻăŽćšćłăăăăăžăăăďź
drain_where
ă drain_if
ăăžăăŻdrain_when
ăŽăăăŞăăŽăŻă drain_filter
ăăăăŻăăăŤć確ă ă¨ćăăžăă
@tmccombsăăăăŽ3ă¤ăŽăăĄă drain_where
ăćăçăŤăăŞăŁăŚăăă¨ćăăžăă ďź if
either do the whole thing (in this case draining) or not
$ăćĺłăă when
ăŻä¸ćçăŞăăŽă§ăăăăă§ăăďź
drain_filter
ă¨ćŻčźăăă¨ăăŻăăźă¸ăŁăŽćťăĺ¤ăŻdrain_where
ďźčŚç´ ăĺé¤ăăĺ ´ĺăŻtrue
ďźă¨ĺăă§ăăăăăŽäşĺŽăŻĺĺăŤăăŁăŚć確/ć示çăŤăăăăăăăŻăăźă¸ăŁăŽćťăĺ¤ăŽćĺłă誤ăŁăŚč§ŁéăăăŞăšăŻă
ĺŽĺŽăăăŽăŻćé䝼ä¸ă ă¨ćăăžăă ăăŽăšăŹăăăŽčŚç´ďź
R: RangeArgument
ăăŠăĄăźăżăčż˝ĺ ăăĺż
čŚăăăăžăăďźtrue
ăčżăă¨ăăăŽă˘ă¤ăă ăă¤ăăŹăźăżăźăŤĺŤăžăăžăăďźdrain_where
ă弽ăă§ăăďź@ăŹăłăŻăăăŠăćăăžăăďź
libsăăźă ăŻăăăŤă¤ăăŚčŠąăĺăăăłăłăťăłăľăšăŻçžćçšă§drain
ăŽăăăŞăĄă˝ăăăĺŽĺŽăăăŞăăă¨ă§ăăă ďźć˘ĺăŽdrain_filter
ăĄă˝ăăăŻNightlyăŤä¸ĺŽĺŽăŞăžăžă§ăăĺŻč˝ć§ăăăăžăăďź https://github.com/rust-lang/rfcs/pull/2369ăŻăăăăăăăŚăä˝ăăăŞăĺĽăŽăăŹă¤ăłăŽăăăŞă¤ăăŹăźăżăźăčż˝ĺ ăăăă¨ăććĄăăŚăăžăďźă¤ăăŹăźăżăćĺžăžă§ćśč˛ťăăăŽă¨ăŻĺŻžç
§çăŤďźă
ćć°´ăŽăăžăăžăŞçľăżĺăăăăăĺ°ăăŞAPIăľăźăă§ăšăŤä¸čŹĺăăăăăŽĺŽé¨ăčĄăăăă¨ćăăžăă
RangeArgument
ăĺĽĺRangeBounds
ďźă¨ăłăŹăŻăˇă§ăłĺ
¨ä˝ďźĺžč
ăŻ..
ăăżă¤ăRangeFull
ăŽĺ¤ă渥ăăă¨ă§ĺŽçžă§ăăžăăďź ďźăĺŻč˝ć§ă¨ăăŚăŻăăĄă˝ăăăćąç¨ĺăăăă¨ăŤăăăĄă˝ăăăŽăăŞăźăăźăăźăăăăăŤăăźăăżăźăłăŞăŠăăăăžăă
1ă¤ăŽĺśç´ăŻă drain
ăĄă˝ăăăĺŽĺŽăăŚăăăă¨ă§ăă ä¸čŹĺă§ăăĺŻč˝ć§ăăăăžăăăä¸ä˝äşćć§ăŽăăćšćłă§ăŽăżĺŻč˝ă§ăă
ćć°´ăŽăăžăăžăŞçľăżĺăăăăăĺ°ăăŞAPIăľăźăă§ăšăŤä¸čŹĺăăăăăŽĺŽé¨ăčĄăăăă¨ćăăžăă
ăăźă ăŻăăăŽç¨ŽăŽĺŽé¨ăčĄăăăăă¨ăăŠăŽăăăŤăăŠăă§äşć¸ŹăăŚăăžăăďź
ćšćłďźĺ
ˇä˝çăŞAPIč¨č¨ăčăĺşăăććĄăăžăăăăăăăćŚĺżľĺŽč¨źăŽĺŽčŁ
ă使ç¨ăăžăďźăăăŻăĺ°ăŞăă¨ăVec::as_mut_ptr
ă¨Vec::set_len
ăäťăăŚăăŞăźăăĺŽčĄă§ăăžăďźă ăŠăă§ăăăžăăžăăă ć°ăăRFCăžăăŻhttps://internals.rust-lang.org/c/libsăŽăšăŹăăă§ăăĺŻč˝ć§ăăăăăăăăăŞăłăŻăăžăă
ç§ăŻăăăĺ°ăéăă§ăăžăă ć°ćĽä¸ăŤĺ é¨ăŽăšăŹăăăéăăžăă
ăăŽăăăŤćŠč˝ăăä¸čŹçăŞAPIăŻçăŤăăŞăŁăŚăăă¨ćăăžăă
v.drain(a..b).where(pred)
ă¤ăžăăăăăŻăăŤăăźăšăżă¤ăŤăŽAPIă§ăă .where(pred)
ăčż˝ĺ ăăăŚăăŞăĺ ´ĺăçŻĺ˛ĺ
¨ä˝ăçĄćĄäťśăŤćĺşăăăžăă
ăăăŻăçžĺ¨ăŽ.drain(a..b)
ăĄă˝ăăă¨.drain_filter(pred)
ăŽćŠč˝ăăŤăăźăăŚăăžăă
drain
ă¨ăăĺĺăăă§ăŤä˝żç¨ăăăŚăăăăăŤä˝żç¨ă§ăăŞăĺ ´ĺăŻă drain_iter
ăŽăăăŞĺĺăŤăăĺż
čŚăăăăžăă
çšăŤwhere
ă¨filter
ă揥ăŽăăăŤçľăżĺăăăŚä˝żç¨ââăăĺ ´ĺăŻăçľćăŽă¤ăăŹăźăżăŽăăŁăŤăżăŞăłă°ă¨ăŽćˇˇĺăéżăăăăăŤă where
ăĄă˝ăăăŤ*_filter
ă¨ăăĺĺăäťăăŞăă§ăă ăăă
v.drain(..).where(pred1).filter(pred2)
ăăă§ăŻă pred1
ă使ç¨ăăŚä˝ăćĺşăăăďźăăăŚă¤ăăŹăźăżăźăŤć¸ĄăăďźăćąşĺŽăă pred2
ă使ç¨ăăŚçľćăŽă¤ăăŹăźăżăźăăăŁăŤăżăźĺŚçăăžăă
pred1
ătrue
ăčżăăă pred2
ăfalse
ăčżăčŚç´ ăŻă v
ăăćĺşăăăžăăăăŤăăŁăŚçćăăăžăăăăăŽçľĺăăăă¤ăăŹăźăżă
ăăŽç¨ŽăŽăăŤăăźăšăżă¤ăŤăŽAPIă˘ăăăźăăŤă¤ăăŚăŠăćăăžăăďź
where
ăŻăă§ăŤăăźăŻăźăă§ăăăăăé˘ć°ĺă¨ăăŚä˝żç¨ă§ăăŞăăă¨ăä¸çŹĺżăăžăăďź/
ăžăă drain
ăŻăă§ăŤĺŽĺŽăăŚăăăăăĺĺă使ç¨ă§ăăžăăă
揥ăŤăĺ
¨ä˝ă¨ăăŚ2çŞçŽăŤčŻăăŞăăˇă§ăłăŻăçžĺ¨ăŽdrain
ăçśćăă drain_filter
ăŽĺĺădrain_where
ăŤĺ¤ć´ăăŚă .drain(..).filter()
ă¨ăŽćˇˇĺăéżăăăă¨ă ă¨ćăăžăă
ďźjonhooăä¸ă§č¨ăŁăăăăŤ:)
ăăŽdailen_filterăŤdrain_whereă§ăŻăŞăĺĺăäťăăççąăŻä˝ă§ăăăďź ç§ăŤă¨ăŁăŚăĺč ăŻVecĺ ¨ä˝ăćĺşăăăăă¨ăćĺłăăžăăăçľćăŤĺŻžăăŚăăŁăŤăżăźăĺŽčĄăăăă¨ăćĺłăăžăďźćĺăŤčŚăă¨ăăăăăăŻ.drainďź..ďźăfilterďźďźă ăă§ăŻăăăžăăă ďź "ďźă ä¸ćšăĺč ăŻăä˝ăăăŽćĄäťśăćçŤăăčŚç´ ăŽăżăćĺşăăăă¨ă示ăăŚăăžăă
ĺ
é¨ăŽăšăŹăăăéăăžăăă
TLDRăŻăéčŞĺˇąćŻć¸ăŻä¸čŹçăŞăąăźăšă§äşćłăăăăăă大ăăŞăŻăźă ăŽçźśă§ăăă RangeBounds
ăăŠăĄăźăżă使ç¨ăăŚĺžă§ă§ăŻăŞăćŠădrain_filter
ăĺŽĺŽăăăĺż
čŚăăăă¨ćăăžăă 誰ăăăăă§ćŚčŞŹăăăĺéĄă解湺ăăăăăŽčŻăčăăćăŁăŚăăŞăéăă
硨éďźĺŽé¨ăłăźăăă˘ăăăăźăăăžăăďźĺŽé¨ăćĺşăăžă
ăăŹă¤ăłă¨ăŻăŞă˘ăŽăăłăă¨ăăă¤ăăŽăăšăăăăăžăăăăŻăŞăźăłăŞăłăźăăŻćĺž
ă§ăăžăăă
ăăŽăšăŹăăăĺŽĺ
¨ăŤčŚéăăžăăă ăăŽăšăŹăăă§čŞŹćăăăŚăăăŞăăˇă§ăłăŽăăă¤ăăĺć ăăăăăŤăĺ°ă俎ćŁăăŚăłăăźăăŚč˛źăäťăăĺ¤ăimplăăăăžăă çŠč°ăé¸ăăă¨ăăŞăă¨ç§ăćăimplăŽčŻăçšăŽ1ă¤ăŻăăăăDoubleEndedIterator
ăĺŽčŁ
ăăŚăăăă¨ă§ăă ăăă§ăăă襨示ăăžăă
@Emerentiusă§ăăăĺ°ăŞăă¨ădrain_filter
ăŽĺĺădrain_where
ăŤĺ¤ć´ăăŚăčŚç´ ăĺé¤ăăăăăŤăŻăăźă¸ăŁăźătrue
ăčżăĺż
čŚăăăăă¨ă示ăĺż
čŚăăăăžăă
@BoscopăŠăĄăăă true
=>ćŠçăžăăŽĺăă漾ć§ăăćĺłăăžăă ĺäşşçăŤăŻă drain_filter
ă¨ĺźă°ăăădrain_where
ă¨ĺźă°ăăăăŻé˘äżăăăžăăă
@Popogéăă¨éˇćă¨çćăčŚç´ă§ăăžăăďź çćłçăŤăŻăăăăă§çľăăăžăă DoubleEndedIterator
ćŠč˝ăŻăăźăăžăăŻä˝ăŞăźăăźăăăă¨äşćć§ăćăŁăŚéćšĺăŤčż˝ĺ ă§ăăă¨ćăăžăďźăă ăăăăšăăŻăăŚăăžăăďźă
drain_or_retain
ăŠăă§ăăďź ăăăŻććłçăŤćĺłăŽăăă˘ăŻăˇă§ăłă§ăăăăŠăĄăăä¸ćšăĺŽčĄăăăă¨ă示ăăžăă
@askeksaăăăăăŻăăźă¸ăŁăźăătrue
ăčżăăă¨ăăăăŹă¤ăłăăćĺłăăăŽăăăäżćăăćĺłăăăŽăăŻć確ă§ăŻăăăžăăă
drain_where
ăŽăăăŞĺĺă§ăŻă true
ăčżăă¨ăăăćĺşăăăăă¨ăŻé常ăŤćç˝ă§ăăăćĺşăăăŞăčŚç´ ăäżćăăăăă¨ăŻčŞ°ăŤă¨ăŁăŚăćăăăŞăŻăă§ăă
ć水玥ăĺśé/ĺć˘/ăăŁăłăťăŤ/ä¸ć˘ăăćšćłăăăă°ăăăŽăŤă¨ćăăžăă ăă¨ăă°ăćĺăŽNĺăŽĺść°ăćĺşăăăĺ ´ĺăŻă vec.drain_filter(|x| *x % 2 == 0).take(N).collect()
ďźăžăăŻăăŽĺ¤ĺ˝˘ďźăĺŽčĄă§ăăă¨äžżĺŠă§ăă
çžĺ¨ĺŽčŁ
ăăăŚăăăăă DrainFilter
ăŽdrop
ăĄă˝ăăăŻĺ¸¸ăŤăăŹă¤ăłăĺŽčĄăăŚĺŽäşăăžăă ăăăä¸ć˘ăăăă¨ăŻă§ăăžăăďźĺ°ăŞăă¨ăç§ăŻăăăčĄăăăŞăăŻăčŚă¤ăăŚăăžăăďźă
ăăŽĺä˝ăĺż čŚăŞĺ ´ĺăŻă襨示ăăć°ă追补ăăçść ăéăăŚăfalseăčżăĺ§ăăĺż čŚăăăăžăă ă˘ăăăżăźăéŠĺăŤĺä˝ăăăăŤăŻăăăăăćăŤĺŽäşăăăžă§ĺŽčĄăăĺż čŚăăăăžăă
drain_filter
ăçžĺ¨ĺŽčŁ
ăăăŚăăćšćłăĺŽĺ
¨ă§ăŻăŞăăă¨ăŤć°ăĽăăžăăăă
ĺŽéăŤăŻĺŽĺ
¨ä¸ăŽĺéĄăăăăžăă ăă¤ăă+ĺŽĺ
¨ăĺéăăžăă ăăăŤăăăăŻç°ĄĺăŤä¸ć˘ăĺźă辡ăăăžăă严ćš
ăăŽăăĄăstdăŽăĄă˝ăăăĺŽéăŤćă¤ăšăă§ăŻăŞăĺä˝ă§ăă ăăăŚăăăć¸ăăŚăăéăç§ăŻć°ăĽăăžăăçžĺ¨ăŽĺŽčŁ
ăŻĺŽĺ
¨ă§ăŻăŞăăă¨
Vec
ăŻăăăŠăŤăă§ăŻă˘ăłăŻă¤ăłăăťăźăă§ăŻăăăžăăăă drain_filer
ăŽĺä˝ăŻ
čż°čŞăŽăăăăŻăŻéŠăăšăăă¨ă§ăăççąăŻćŹĄăŽă¨ăăă§ăă
ăăŽĺä˝ăŽäžăŻćŹĄăŽă¨ăăă§ăă
play.rust-lang.org
2.ăă¤ăłăăŻč§ŁćąşĺŻč˝ă§ăăăŻăă§ăăăăăčŞä˝ăŽćĺăŽăă¤ăłăăŻč§ŁćąşĺŻč˝ă§ăăă¨ćăăžă
ĺŽäşăžă§ĺŽčĄăăDrainFilter
ăŽĺä˝ăŽĺć¤č¨ăŤă¤ăŞăăăžă
ăăăăćăŤăăăăĺ¤ć´ăăççąăŻćŹĄăŽă¨ăăă§ăă
drain_filter
ăŤć¸Ąăăăčż°čŞăŻăçśćłăŤăăŁăŚăŻăăăăŻăŤăŞăĺŻč˝ć§ăăăăžăďźăăăŻăŞăŠďźDrainFilter
ăćĺžăžă§ĺŽčĄăăŞăă¨ă揥ăŽăăăŤăŞăĺŻč˝ć§ăăăăžăăĺŽčĄăăŚĺŽäşăăăăăŽĺźć°ăŻćŹĄăŽă¨ăăă§ăă
drain_filter
ăŻé˘ć°ă§ăăratain
ăŤäźźăŚăăăŽă§ăäşşă
ăŻéŠăăăăăăăăžăăăDrainFilter
ăăăă ăăăăăăăžă#[unused_must_use]
ăŽççąă§ăă.for_each(drop)
ă使ç¨ăăăă¨ăăĺ§ăăăžăDrainFilter
ăăăăăćăŤčĄăăă¨ă§ădrain_filter
ăŻĺŻä˝ç¨ăŽăăă ăăŤä˝żç¨ăăăăă¨ăĺ¤ăăŽă§ăĺéˇăŤăăĺż
čŚăăăăžăretain
ă¨ăťăźçăăăŞăăžă&T
ă使ç¨ăçśăădrain_filterăŻ&mut T
ă使ç¨ăăžăfind
ă all
ă any
ăŞăŠăŽă˘ăăăżăźă¨çľăżĺăăăă¨ăăăăăćăŤĺŽäşăăŞăă¨é常ăŤćˇˇäšąăăĺŻč˝ć§ăăăăžăăăăăŤăŻăăŞăăŽççąăăăăžăăçžĺ¨ăŽĺä˝ăçśćăăžăăăăăŻç§ă ăăăăăăžăăăăç§ăŻăăă¤ăăŽăă¤ăłăăéăăăăăăăžăăăă Drop
ăŽĺä˝ăĺ¤ć´ăă
#[unused_must_use]
ăčż˝ĺ ăăăŽăćăžăăă¨ćăăăžăăďź
.for_each(drop)
ăéˇăăăĺ ´ĺăŻă䝣ăăăŤă揥ăŽçŽçăŽă¤ăăŹăźăżăŽRFCăčż˝ĺ ăăăă¨ăć¤č¨ăăŚăă ăăă
complete()
ăŽăăăŞăĄă˝ăăăă¤ăăŹăźăżăŤčż˝ĺ ăăă¨ăăĺŻä˝ç¨ăăăăžăďźăžăăŻdrain()
ă§ăăăăăăŻ
ĺŽĺ
¨ăŤç°ăŞăč°čŤă§ăďź
äťďź
ĺ
ăŽççąăŻčŚă¤ăăăžăăăăă˘ăăăżăźăDrainFilter
ă§ĺä˝ăăĺŽĺ
¨ăŤĺŽčĄăăăŞăă¨ăăĺéĄăăăŁăăă¨ăčŚăăŚăăžăă
https://github.com/rust-lang/rust/issues/43244#issuecomment-394405057ăĺç §ăăŚăă ăă
čŻăçšăăă¨ăă°find
ăŻăćĺăŤăăăăăăžă§ăăŹă¤ăłăăăŹă¤ăłăăžăă
ä¸č´ăĺć§ăŽall
ă any
ăŻç羥ăčĄăăžăăăăăăŻé常ăŤćˇˇäšąăăĺŻč˝ć§ăăăăžă
ăŤé˘ăăŚă ăăŹă¤ăłă
ăăźăăĺ¤ĺç§ăŻç§ăŽćčŚăĺ¤ăăĺż
čŚăăăăžăă ăăăŤăăăä¸čŹçăŞĺéĄăŤăŞăĺŻč˝ć§ăăăăžă
ă¤ăăŹăźăżăŤăŻĺŻä˝ç¨ăăăăä¸čŹçăŞč§Łćąşçăć¤č¨ăăĺż
čŚăăăăăăăăžăă
ďźăăŽčż˝čˇĄăŽĺéĄă¨ăŻé˘äżăăăžăăďź .allways_complete()
ă˘ăăăżăźăŽăăăŤă
ĺäşşçăŤăŻăăăŹă¤ăłăćĺžăžă§ĺŽčĄăăĺż
čŚăăăĺŽĺ
¨ä¸ăŽççąăŻčŚă¤ăăăžăăă§ăăăăä¸č¨ăŽăăă¤ăăŽć稿ă§ć¸ăăăăăŤă next()
ăŽĺŻä˝ç¨ăŻă take_while
ăŞăŠăŽă˘ăăăżăźă¨ćéŠă§ăŻăŞăćšćłă§ç¸äşä˝ç¨ăăžăpeekable
ăăăłskip_while
ă
ăăăŻăžăăéčŞĺˇąćĺşăăŹă¤ăłă¨ăăŽăłăłăăăŞăłčŞĺˇąćĺşă¤ăżăźă˘ăăăżăźRFCăŤé˘ăăç§ăŽRFCă¨ĺăĺéĄăĺźă辡ăăăžăă
drain_filter
ăŻç°ĄĺăŤä¸çľśăĺźă辡ăăĺŻč˝ć§ăăăăŽăŻäşĺŽă§ăăăĺŽĺ
¨ć§ăŤéĺăăäžă示ăăă¨ăă§ăăžăăďź
ăăăç§ăŻăă§ăŤăăŁăďź play.rust-lang.org
ăăăŻăŠăă§ăăďź
#![feature(drain_filter)]
use std::panic::catch_unwind;
struct PrintOnDrop {
id: u8
}
impl Drop for PrintOnDrop {
fn drop(&mut self) {
println!("dropped: {}", self.id)
}
}
fn main() {
println!("-- start --");
let _ = catch_unwind(move || {
let mut a: Vec<_> = [0, 1, 4, 5, 6].iter()
.map(|&id| PrintOnDrop { id })
.collect::<Vec<_>>();
let drain = a.drain_filter(|dc| {
if dc.id == 4 { panic!("let's say a unwrap went wrong"); }
dc.id < 4
});
drain.for_each(::std::mem::drop);
});
println!("-- end --");
//output:
// -- start --
// dropped: 0 <-\
// dropped: 1 \_ this is a double drop
// dropped: 0 _ <-/
// dropped: 5 \------ here 4 got leaked (kind fine)
// dropped: 6
// -- end --
}
ăăăăăăăŻĺŽčŁ
ăŽĺ
é¨çăŞčăćšă§ăăăăăžăăăăžăăă§ăăă
ĺşćŹçăŤăćŞč§ŁćąşăŽčłŞĺăŻăčż°čŞé˘ć°ăŽpanic
ăĺŚçăăćšćłă§ăă
ăă1ă¤ăŽčłŞĺăŻăăăăăćăŤapiăŚăźăśăźĺ
Ľĺă¨čŚăŞăăă¨ăă§ăăé˘ć°ăĺŽčĄăăăă¨ăăĺ§ăăăăăŠăăă§ăă
ä¸čŹçăŤăŻăăăăfind
ă any
ăŞăŠă桡䚹ăăăŞăăăăŽĺŻä¸ăŽćšćłă§ăă
ăăśăăčć Žäşé ăŻćŹĄăŽăăăŞăăŽăăăăăžăăďź
next
ăŤĺ
Ľăă¨ăăŤăăŠă°ăč¨ĺŽăă next
ăăćťăĺăŤăăŠă°ă解é¤ăăžăăăśăăăŁă¨čŻă解湺çăăăăžăă
ăŠăĄăă使ç¨ăăŚăăĺŽčŁ
ĺžăŻrustdocăŤćć¸ĺăăĺż
čŚăăăăžăă
@dathinab
ăăăç§ăŻăă§ăŤăăžăă
ćźăăŻćăžăăăăăžăăăăĺéĄăŻăŞăăăăă§ĺéżăăăŽăŻéŁăăăăăăăžăăăăăăăŤăăăăăŻçľśĺŻžăŤăăăžăăă ăăăăŁăăďź ăăŽĺŽĺ ¨ć§ăŽĺéĄăŤă¤ăăŚĺĽăŽĺéĄăĺ ąĺăăžăăďź
drain_filter
ăŻăăłăŹăŻăˇă§ăłăăă˘ă¤ăă ăĺé¤ăăăăłăŤĺĺ˛ăĺ˝ăŚăčĄăăžăăďź ăžăăŻăĺĺ˛ăĺ˝ăŚăŻ1ĺă ăă§ăC ++ăŽstd::remove
ă¨std::erase
ďźăă˘ă§ďźăŽăăăŤćŠč˝ăăžăăďź ĺ˛ăĺ˝ăŚă1ă¤ă ăăŞăŽă§ăăăŽăăăŞĺä˝ăăĺ§ăăăžăăčŚç´ ăăłăŹăŻăˇă§ăłăŽćĺžăŤé
罎ăăĺé¤ăăŚéŠĺăŞăľă¤ăşăŤç¸Žĺ°ăăžăă
ăžăăăŞătry_drain_filter
ăăŞăăŽă§ăăďź Option
ăżă¤ăăčżăăĺć˘ăăĺż
čŚăăăĺ ´ĺăŻNone
ĺ¤ăčżăăžăăďź ç§ăŻé常ăŤĺ¤§ăăŞăłăŹăŻăˇă§ăłăćăŁăŚăăăĺż
čŚăŞăăŽăăă§ăŤćăŤĺ
ĽăăŚăăă¨ăăŤçśăăăŽăŻçĄćĺłă§ăă
ĺĺăłăźăăčŞăă ă¨ăăŻă揥ăŽăăăŞăă¨ăăăžăăďźăăŽăŁăăăăä˝ćăăžăă
čŚç´ ă秝ĺăăćĺşăăăŚăăŞăčŚç´ ă秝ĺăăĺ ´ĺ
ăŽăŁăăăčŚă¤ăăŁăăăăŽăŁăăăŽĺ§ăžăă§ăă ăăă§ăăăŞăăă°ăŞăăŞăĺčŚç´
秝ĺďźé
ĺăŽĺ¤ăžăăŻć°ăăĺ ´ćă¸ăŽç§ťĺďźăŻ1ĺă ă秝ĺăăăžăă
ăžăăăă¨ăă°remove
ăŽăăăŤăĺĺ˛ăĺ˝ăŚăăăžăăă 解ćžăăăé¨ĺăŻ
ćŞä˝żç¨ĺŽšéăŽä¸é¨ă
2018ĺš´8ć10ćĽéććĽă07ďź11 Victor [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăďź
drain_filterăŻăă˘ă¤ăă ăĺé¤ăăăăłăŤĺĺ˛ăĺ˝ăŚăčĄăăžăăďź
ăłăŹăŻăˇă§ăłďź ăžăăŻăĺĺ˛ăĺ˝ăŚă1ĺă ăčĄăăstd :: removeăŽăăăŤćŠč˝ăăžă
ăăăłstd :: Eraseďźăă˘ă§ďźC ++ă§ďź ç§ăŻăăŽăăăŞčĄĺă弽ăăŽă§
ćŁç˘şăŤ1ă¤ăŽĺ˛ăĺ˝ăŚďźčŚç´ ăăłăŹăŻăˇă§ăłăŽćĺžăŤé 罎ăăă ăă§ă
揥ăŤăéŠĺăŞăľă¤ăşăŤç¸Žĺ°ăăŚĺé¤ăăžăăăžăăăŞătry_drain_filterăăŞăăŽă§ăăďź ăŞăăˇă§ăłăżă¤ăăčżăăăŽăăăăł
ăăăăšăăŞă䞥ĺ¤ăŻăăăžăăăďź ç§ăŻé常ăŤĺ¤§ăăŞăłăŹăŻăˇă§ăłăćăŁăŚăăžăăăăăŚăăăŻ
ç§ăĺż čŚăŞăăŽăăă§ăŤćăŤĺ ĽăăŚăăă¨ăăç§ăŽăăăŤçśăăăă¨ăŻçĄćĺłă§ăăâ
ăăŞăăč¨ĺăăăăŽă§ăăăŞăăŻăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/rust-lang/rust/issues/43244#issuecomment-411977001 ă
ăžăăŻăšăŹăăăăăĽăźăăăžă
https://github.com/notifications/unsubscribe-auth/AHR0kdOZm4bj6iR9Hj831Qh72d36BxQSks5uPRYNgaJpZM4OY1me
ă
@rustonautăăăă¨ăă try_drain_filter
ăŤă¤ăăŚăŠăćăăžăăďź :)
PSăłăźăă調ăšăă¨ăăăĺ¸ćăŠăăăŤćŠč˝ăăŚăăăăăŤčŚăăžăă
ĺ垊ćăŤčŚç´ ăă¨ăŤé˛ăăăăé常ăŻćĺž
ă§ăăžă
ăăăăăăăă¨ăăŤĺ垊ăĺć˘ăăžăăăăăă
ç´ăăăăăŽă§ăč˝ă¨ăăă¨ăăŤĺŽéăŤćĺžăžă§ćĺşăăăžăă
ďźăăăŻăäşéăŽăăăăŻăŞăŠăŽĺŻč˝ć§ăŽăăăăźăăĺçăŤĺ˘ĺ ăăăžă
ăăŽăăăŤďźă
ăăăăŁăŚăăăŞăăŽăăăŤĺä˝ăă芌ç¨çăĺ
ĽćăăĺŻč˝ć§ăŻăťă¨ăăŠăăăžăăă
äşćłă
ĺ
ŹĺšłăćăăăăŤăĺ垊ăĺŽéăŤćˇˇäšąăăĺŻč˝ć§ăăăĺ ´ĺăŻăćŠććăĄĺăăčĄă
ăăă¤ăăŽçśćłăäžăă°thing.drain_where(|x| x.is_malformed()).any(|x|
x.is_dangerus())
ăŻăăăšăŚăŽä¸ćŁăŞĺ˝˘ĺźăŽăăŽăćĺşăăăŽă§ăŻăŞăă
ăăăĺąéşă§ăă ďźçžĺ¨ăŽĺŽčŁ
ăŻăăšăŚăŽä¸ćŁăŞĺ˝˘ĺźăćĺşăăžă
ăăăăćăŤćć°´ăçśăăăă¨ăŤăăŁăŚďźă
2018ĺš´8ć10ćĽéććĽă10ďź52 Victor [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăďź
@rustonauthttps ďź//github.com/rustonautăăăă¨ăă ăăŞăăŽćčŚăŻä˝ă§ăă
try_drain_filterăŤă¤ăăŚďź :)â
ăăŞăăč¨ĺăăăăŽă§ăăăŞăăŻăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/rust-lang/rust/issues/43244#issuecomment-412020490 ă
ăžăăŻăšăŹăăăăăĽăźăăăžă
https://github.com/notifications/unsubscribe-auth/AHR0kcEMHCayqvhI6D4LK4ITG2x5di-9ks5uPUnpgaJpZM4OY1me
ă
ăăăŻăăŁă¨ç¨éăĺşăă¨ćăăžăďź
fn drain_filter_map<F>(&mut self, f: F) -> DrainFilterMap<T, F> where F: FnMut(T) -> Option<T>
ăăăŤăĄăŻăç§ăŻHashMap
ăŽdrain_filter
ćŠč˝ăć¤ç´˘ăăŚăăžăăăăĺĺ¨ăăžăăăăăăčŚă¤ăăă¨ăăŤĺéĄăéăăăăŤćąăăăăžăăă ĺĽăŽĺéĄăŤăăĺż
čŚăăăăžăăďź
çžĺ¨ăăăăĺŽĺŽĺăă匨ăăŚăăăăŽăŻăăăžăăďź ä¸ă§ĺ ąĺăăăăăŤăăăăŻăžă ăťăŠăăŚăăžăăďź
ăăăŻăăŞăĺ°ăăŞćŠč˝ăŽăăăŤćăăžăăă1嚴䝼ä¸ä˝żç¨ăăăŚăăžăăă
ăăăŻăăŁă¨ç¨éăĺşăă¨ćăăžăďź
fn drain_filter_map<F>(&mut self, f: F) -> DrainFilterMap<T, F> where F: FnMut(T) -> Option<T>
ăăăŻdrain_filter
ă¨map
ăŽć§ćăăăĺŞăăŚăăă¨ăŻćăăžăăă
ä¸ă§ĺ ąĺăăăăăŤăăăăŻăžă ăťăŠăăŚăăžăăďź
ĺ垊ăćŠćăŤĺć˘ăăĺ ´ĺăŤä¸č´ăăăăšăŚăŽčŚç´ ăćĺşăăŞăăă DrainFilter
ăŽăăăăă§ăăŁăŤăżăŞăłă°ă¨ćĺžăžă§ćĺşăăĺ ´ĺăŻă塝ăćťăä¸ăŤăăăăŻăçşçăăĺŻč˝ć§ăăăăăă¨ăăéŁăăé¸ćăăăăăă§ăă
ăăŽćŠč˝ăŻăŠăĄăăŤăăŚăĺéĄăăăăăăăăŽă§ăĺŽĺŽăăăăšăă§ăŻăŞăă¨ćăăžăă
塝ăćťăćăŽĺä˝ăç°ăŞăăă¨ăŤçšăŤĺéĄăŻăăăžăăďź
ĺŻč˝ć§ďź
ç§ăŻčăăăă¨ăă§ăăćăĺăăăăăĺčŤăŻă¤ăžădrop
é常ăŤăăŁăŚćäžăä¸ĺ¤ăŤäžĺăăăłăźădrain_filter
ćĺžăŤăVECăŽčŚç´ ăćŁç˘şăŤăăŽăăăăă¨ăŤăŞăăă¨ăăăă¨ďźćĄäťśăŤĺ¤ąćăăĺ ´ĺďźăŻă drain_filter
ă使ç¨ăăăłăźăďźăťă¨ăăŠăŽĺ ´ĺăé常ăŽĺŽĺ
¨ăŞăłăźăďźăăäťťćăŤé˘ăăŚăăĺŻč˝ć§ăăăăžăă
ăăăăăăŽăăăŞĺ ´ĺăăăŁăă¨ăăžăăăăăăŽăłăźăăŻăăŚăźăśăźăăŠăŽăăăŤč¨čż°ăăŚăăă°ăăăăžăăăă¨ăă°ăéăŤăŞăŁăŚăšăŻăăăĺé¤ăăăčŚç´ ăĺŤăĺ˝äť¤ăŤăźăăä˝ćăăćĄäťśăăăăăŻăŤăŞăăăăăăăăăŁăŤăżăźćĄäťśăfalseă§ăăăă¨ăŤĺ¤§ăăäžĺăăŚăăĺ ´ĺăăłăźăăŤăŻăžă ăă°ăăăăžăă drop_filter
ăăăŞé˘ć°ăăăăăăŽăăăĽăĄăłăă§ăăŽă¨ăă¸ăąăźăšăŤćł¨ćăĺăăăă¨ăă§ăăăŽă§ăćŻčźăăă¨ćšĺăŽăăăŤćăăžăă
ăžăăăăăă§ăăšăŹăăăŽĺĺăŤć稿ăăăăăŽéăłĺ ´ăŽäžăčŚă¤ăăžăăăăăăŻăçžĺ¨ăŽĺŽčŁ ăăžă čŚç´ ăăăăŤăăăăăăŚăăăă¨ă示ăăŚăăžăă ďźă ăăăăăŽăžăžă§ăŻçľśĺŻžăŤĺŽĺŽăăăăă¨ăŻă§ăăžăăďźďź
ĺĽĺ ¨ć§ăŽăă°ăŤă¤ăăŚĺĽăŽĺéĄăéă䞥ĺ¤ăăăăăăăăžăăăďź ăăŽĺžăăăăŻI-unsoundă¨ăăŚăăźăŻăăăă¨ăă§ăăžăă
ç§ăŽçĽăéăăăăŞăăŻăăźăŻăäťăăăă¨ăăăăăŤăăăăŻăŽăăăŤä¸ĺĽĺ
¨ăŤăăăă¨ăă§ăăžăăă
ä¸ć˘ăăăŽă§é常ăŤä¸äžżă§ăă ăžăăç§ăčŚăăŚăăéăă§ăŻ
ăăăŤăăăăŻăŽĺŻč˝ć§ăŻăă°ă§ăŻăŞăăćéťăŽăăĄăŤĺä˝ăăžăă
ć
ćăŤé¸ă°ăăžăăă
ăŞăăˇă§ăłăŻĺşćŹçăŤćŹĄăŽă¨ăăă§ăă
ĺéĄăŻćŹĄăŽă¨ăăă§ăă
ăžăăŻăč¨ăćăăă¨ă1ăé常ăŽăŚăźăšăąăźăšă§ăŻćˇˇäšąăćăă2ă
čż°čŞăăăăăŻăŤăŞăĺŻč˝ć§ăăăĺ ´ĺăŤä¸ć˘ăă3.ă4ă ăăŞăăćŹĺ˝ăŤă§ăăŞăăăăŤăăăä˝ăăžă
ăăăăăĄă˝ăăă§ä˝żç¨ăăžăăăăăă§ä˝żç¨ăăé˘ć°ăŻăŠăŽăăăŤăŞăăžăă
ĺ
é¨ă§ăŻä˝żç¨ăăžăăă
ăăŽăŞăăˇă§ăłăŽçľćă¨ăăŚ3.ă4ă čĄăăžăăă ăŞăăˇă§ăł2ăŽĺéĄăŻćŹĄăŽă¨ăăă§ăă
1.ăŞăŽă§2.ăŽăăŽăăăçăăăăŽăé¸ă°ăăžăăă
ç§čŚă§ăŻăĺŽčĄăăăŞădrain + drain_filterAPIăćăŁăŚăăćšăčŻăă§ăăă
ăăăăă§ĺŽäşăăăžă§+ĺŽčĄăăăä¸čŹçăŞă¤ăăŹăźăżăłăłăăăźăż
ăăăăćăŽĺŽäş+ă¤ăăŹăźăżăĺŽäşăăăăăšăŚăăăăăăăăĄă˝ăă
ćŽăăŽă˘ă¤ăă ă ĺéĄăŻăăăŹă¤ăłăăă§ăŤĺŽĺŽăăŚăăăă¨ă§ăăă¤ăăŹăźăż
ăłăłăăăźăżăŻăĺ
é¨ă¤ăăŹăźăżă¨ăăŹă¤ăłăčĺăăĺż
čŚăăăăăăăŞăźăăźăăăăčż˝ĺ ăăžă
ćăéŠĺăŞĺĺă§ăŻăŞăĺŻč˝ć§ăăăăžăă
2019ĺš´5ć20ćĽćććĽă09ďź28 [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
ĺĽĺ ¨ć§ăŽăă°ăŤă¤ăăŚĺĽăŽĺéĄăéă䞥ĺ¤ăăăăăăăăžăăăďź ăă§ăă
揥ăŤăI-unsoundă¨ăăŚăăźăŻăăăžăăâ
ăăŞăăč¨ĺăăăăŽă§ăăăŞăăŻăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/rust-lang/rust/issues/43244?email_source=notifications&email_token=AB2HJEL7FS6AA2A2KF5U2S3PWJHK7A5CNFSM4DTDLGPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKT
ăžăăŻăšăŹăăăăăĽăźăăăžă
https://github.com/notifications/unsubscribe-auth/AB2HJEMHQFRTCH6RCQQ64DTPWJHK7ANCNFSM4DTDLGPA
ă
ăă ăăăăăŤăăăăăŻä¸ĺĽĺ ¨ă§ăă
ĺĽĺ ¨ć§ăŽĺéĄăŽăăăŤďź60977ăä˝ćăăžăă
ăăăă§ăç§ăŻăăăŤăăăăăăăăŤăăăăŻă¨ăăŚčŞăăŽăŻćăă ă¨ćăăŚăăžăďźman_facepalming:ă
- =>ăăăăŻăŽçŤăĄĺŻăă¨ĺ¤ă§ăŽäşćăăŞăéăă ăă
ăăăăé˘ć°ă§čŞ°ăă_using_drain_filteră¨čăăŚăă ăăă
3.ă4ă ăăŞăăćŹĺ˝ăŤă§ăăŞăăăăŤăăăä˝ăăžă
ăăăăăĄă˝ăăă§ä˝żç¨ăăžăăăăăă§ä˝żç¨ăăé˘ć°ăŻăŠăŽăăăŤăŞăăžăă
ĺ é¨ă§ăŻä˝żç¨ăăžăăă
ăăăŻç§ăŤă¨ăŁăŚăžă 大ăăăă¨ă§ăŻăăăžăăă
誰ăăăăăăŻăŤăŞăĺŻč˝ć§ăŽăăćĄäťśă§Dropimpl㧠drain_filter
ă使ç¨ăăĺ ´ĺăĺéĄăŻĺ˝źăădrain_filter
ă使ç¨ăăăă¨ăé¸ćăăăă¨ă§ăŻăăăžăăăĺć§ăŤăăĄă˝ăăăĺ
é¨ drain_filter
ă使ç¨ăăăăŠăăăŻé˘äżăăăžăăă
çłă訳ăăăžăăăăčżäżĄăćŠăăăžăăă ç§ăŻăăŞăăäťä˝ăćĺłăăŚăăăŽăăăăă¨ćăăžăă ăăăăăĺ°ă芳ăă誏ćăăžăă
ăăŚăăăŞăăŽč°čŤăŻă$ drain_filter
ă使ç¨ăădrop
implĺ
ăŽăłăźăăŻăă˘ăłăŻă¤ăłăä¸ăŤĺŽčĄăăăĺ ´ĺăä¸ćč°ăŞăă¨ăŤĺŁăăăă¨ăăăă¨ăăăă¨ă§ăă ďźăăăŻdrain_filter
ăŽăăăăŻă§ăŻăŞăă drain_filter
ăĺŽčĄăăăäťăŽăłăźăăŽăăăăŻăŤă¤ăăŚă§ăďźďź
impl Drop for Type {
fn drop(&mut self) {
self.vec.drain_filter(|x| x == 3);
// Do stuff that assumes the vector has no 3's
...
}
}
ăăŽăăăăimplăŻăă˘ăłăŻă¤ăłăä¸ăŤçŞçśčޤĺä˝ăăžăă
ăăăŻç˘şăăŤăçžĺ¨ăŽăšăŹăăăăăăăŻăŤéĽăŁăŚăăăăŠăăăDrainFilterăŤç´ ć´ăŤć¤ĺşăăăăă¨ăŤĺŻžăă誏ĺžĺăŽăăč°čŤă§ăă
drain_filter
ăŽç¨čŞăŻăç§ăŤă¨ăŁăŚăă䝼ćĽćăăă使ăăăŚăăžăă ăăšăŚăŽă˘ă¤ăă ăĺé¤ăăăăăŽdrain
ăăă§ăŤăăă¨ăăă¨ăĺé¤ăăă˘ă¤ăă ăé¸ćăăă¨ă filter
ăŤăŞăăžăă ä¸çˇăŤçľăżĺăăăă¨ăĺ˝ĺăŻé常ăŤä¸č˛ŤăăŚăăăăăŤćăăžăă
ăăăŤăăăăŻăŽĺĽĺ
¨ć§ăŽĺéĄăŽäżŽćŁăŤăăăčż°čŞăŤăăăăŻăçşçăăĺ ´ĺă§ăăćŽăăŽVec
ăŻăăŽăžăžćŽăăžăă ă˘ă¤ăă ăŻăŽăŁăăăĺăăăăăŤăăăŻăˇăăăăăžăăăăă䝼ĺ¤ăŽĺ ´ĺăŻăăŽăžăžăŤăŞăăžăďźăăăŚă塝ăćťăä¸ăŤVec::drop
ăäťăăŚăăăăăăăăăăăăăŻăçşçăăĺ ´ĺăŻăŚăźăśăźăŤăăŁăŚĺŚçăăăžăďźă
vec::DrainFilter
ăéä¸ă§ăăăăăăă¨ăĺŽĺ
¨ăŤćśč˛ťăăăăăŽăăăŤĺä˝ăçśăăžăďźăăăŻvec::Drain
ă¨ĺăă§ăďźă vec::Drain::drop
ăŽéăŤčż°čŞăăăăăŻăŤăŞăŁăĺ ´ĺăćŽăăŽă˘ă¤ăă ăŻé常ăŠăăăăăŻăˇăăăăăžăăăăă䝼ä¸ăŽă˘ă¤ăă ăŻăăăăăăăăčż°čŞăŻĺ庌ĺźăłĺşăăăžăăă čż°čŞăŽăăăăŻăé常ăŽćśč˛ťä¸ăŤçşçăăăă vec::DrainFilter
ăăăăăăăăă¨ăăŤçşçăăăăŤé˘äżăŞăăĺşćŹçăŤĺăăăăŤĺä˝ăăžăă
ĺĽĺ ¨ć§ăŽçŠ´ăŽäżŽćŁăćŁăăă¨äťŽĺŽăăă¨ăăăŽćŠč˝ăŽĺŽĺŽĺă匨ăăŚăăäťăŽčŚç´ ăŻä˝ă§ăăďź
Vec::drain_filter
ăŻLinkedList::drain_filter
ă¨ăŻçŹçŤăăŚĺŽĺŽăăăăă¨ăă§ăăžăăďź
drain_filter
ăŽç¨čŞăŽĺéĄăŻă$ drain_filter
ăŽĺ ´ĺăĺŽéăŤăŻćťăĺ¤ă¨ĺ
ăŽăłăŹăŻăˇă§ăłăŽ2ă¤ăŽĺşĺăăăăăŠăĄăĺ´ăăăăŁăŤăżăźĺŚçăăăŚăăăăăć確ă§ăŻăŞăăă¨ă§ăăă˘ă¤ăă ăŻçśăăžăă filtered_drain
ă§ăăăăĺ°ăć確ă ă¨ćăăžăă
ăăăŁăŤăżăŞăłă°ăăăăă˘ă¤ăă ăăŠăĄăĺ´ăŤăăăŽăăŻć確ă§ăŻăăăžăă
Vec::drain
ăŻĺäžăč¨ĺŽăăžăă _ĺé¤_ăăă˘ă¤ăă ăŽçŻĺ˛ăćĺŽăăžăă Vec::drain_filter
ăĺăăăăŤĺä˝ăăžăă _ĺé¤_ăăă˘ă¤ăă ăçšĺŽăăžăă
ăăăŚăăăăŁăŤăżăŞăłă°ăăăăă˘ă¤ăă ăăŠăĄăĺ´ăŤčĄăăŽăăŻćŹĺ˝ăŤć確ă§ăŻăăăžăă
ç§ăŻăăăIterator::filter
ăŤăăă§ăŤĺ˝ăŚăŻăžăă¨čăăŚăăăŽă§ăăăă使ç¨ăăăăłăŤăăăĽăĄăłăă確čŞăăăăăăšăăä˝ćăăăăăĺż
čŚăăăăă¨ăŤčžäťťăăžăăă drain_filter
ă§ăĺăăă¨ăć°ăŤăăžăăă
RubyăŽselect
ă¨reject
ç¨čŞăé¸ăă§ăăă°ăăăŁăăŽă§ăăăăăŽčšăŻăăŁă¨ĺăăĺşčŞăăŚăăžăă
ăăăŤă¤ăăŚä˝ăé˛ĺąăŻăăăžăăďź ĺĺăŻăžă éćšăŤćŽăăŚăăĺŻä¸ăŽăăŽă§ăăďź
ăăăĺŽĺŽăăăŽă匨ăăăăŽăŻăăăžăăďź
DrainFilter
ăŽDrop
implăŻăăăšăăŠăŻăżăŽăăăăăčż°čŞăŽăăăăŻăŤăăăăŻă辡ăăăĺ ´ĺăŤă˘ă¤ăă ăăŞăźăŻăăăăă§ăă ăăăhttps://github.com/rust-lang/rust/issues/52267ăŽć šćŹçăŞĺĺ ă§ăă ăăŽăăăŞAPIăĺŽĺŽăăăăă¨ç˘şäżĄăăŚăăžăăďź
ć°ăŤăăŞăă§ăă ăăăăăăŻăŠăăăhttps://github.com/rust-lang/rust/pull/61224ăŤăăŁăŚäżŽćŁăăăžăăă
ăăŽčż˝čˇĄăŽĺéĄăŤă¤ăăŚăĺ°ă芳ăă誏ćăăžăăăăŽćŠč˝ăĺŽĺŽăăŚăăăăăăŽă漽ăăżăŤăăŚăăžăďźDăăăăŤăźăŻăăăžăăďź
cc @ Dylan-DPC
$ďź$ 2 drain
ďź$ăŽăăăŤă$ drain_filter
ăŤRangeBounds
ăăŠăĄăźăżă使ç¨ăăăăă¨ăŤčłćăžăăŻĺ寞ăŽćąşĺŽăä¸ăăăăă¨ăăăăžăăďź ăăŻăăŤĺ
¨ä˝ăăăŁăŤăżăŞăłă°ăăĺ ´ĺăŻă ..
渥ăăŽăŻç°ĄĺăŞăăăŤćăăăăŽă§ăăăăăăăăčż˝ĺ ăăăă¨ăŤčłćă§ăă
ăăăŻăăŁă¨ç¨éăĺşăă¨ćăăžăďź
fn drain_filter_map<F>(&mut self, f: F) -> DrainFilterMap<T, F> where F: FnMut(T) -> Option<T>
ăťă¨ăăŠăŽĺ ´ĺăăăä¸čŹçăŞăăźă¸ă§ăłăŻă Iterator::{filter_map, find_map, map_while}
ăŽăăăŤă FnMut(T) -> Option<U>
ăăăăžăă ăăŽăăăŤfilter_map
ăä¸čŹĺăă䞥ĺ¤ăăăăăŠăăăŻăăăăžăăăăć¤č¨ăă䞥ĺ¤ăăăăăăăăžăăă
@jethrogbăä¸ă§ććĄăăćšćłăĺ¤ăăĺ°ăŞăăćŁç˘şăŤć˘ăăŚăăăŽă§ăăăăŤĺ°çăăžăăă
fn drain_filter_map<F>(&mut self, f: F) -> DrainFilterMap<T, F>
where F: FnMut(T) -> Option<T>
ç§ăčăăŚăăăăŽďźé ăŽä¸ă§update
ă¨ĺźăă§ăăďźă¨ăŽĺŻä¸ăŽéăăŻăćĺşă¤ăăŹăźăżăčżăăăăŤčăăŚăăŞăăŁăă¨ăăăă¨ă§ăăăăăăăŻćăăăŞćšĺăŽăăă§ăăćĺŽăŽĺ ´ćă§ăŽă˘ă¤ăă ăŽć´ć°ăć˘ĺăŽă˘ă¤ăă ăŽĺé¤ăăăăłĺé¤ăăăă˘ă¤ăă ăŽĺźăłĺşăĺ
ă¸ăŽé
俥ăăľăăźăăăăĺä¸ăŽĺççăŤĺç´ăŞă¤ăłăżăźăă§ăźăšă
ăťă¨ăăŠăŽĺ ´ĺăăăä¸čŹçăŞăăźă¸ă§ăłă§ăŻă$
Iterator::{filter_map, find_map, map_while}
ăŽăăăŤăFnMut(T) -> Option<U>
$ăĺż čŚăŤăŞăăžăă ăăŽăăăŤfilter_map
ăä¸čŹĺăă䞥ĺ¤ăăăăăŠăăăŻăăăăžăăăăć¤č¨ăă䞥ĺ¤ăăăăăăăăžăăă
é˘ć°ăçćăăĺ¤ăŻVec<T>
ăŤć źç´ăăăăăăé˘ć°ăŻOption<T>
ăčżăĺż
čŚăăăăžăă
@ johnw42ăăŠăăźăăăăŠăăăŻăăăăžăăăă Some
ăŽĺ¤ăŻă¤ăăŹăźăżăŤăăŁăŚăăăŤçćăăăžăăăďź
ĺŽéăăăŽé˘ć°ăŽĺ
Ľĺĺ¤ăŻăćĺşăăăăŞăĺ ´ĺăŤĺăăŚă T
$ă§ăŻăŞă&T
ăžăăŻ&mut T
ă§ăăĺż
čŚăăăă¨ćăăžăă ăžăăŻăé˘ć°ăŻFnMut(T) -> Result<U, T>
ăŽăăăŞăăŽă§ăăĺŻč˝ć§ăăăăžăă ăăăăă˘ă¤ăă ăżă¤ăăäťăŽăżă¤ăăŤă§ăăŞăççąăăăăăžăăă
@timvermeulenç§ăăĄăŻććĄăĺĽăŽćšćłă§č§ŁéăăŚăăă¨ćăăžăă
ç§ăŽč§Łéă§ăŻă Some
ăŽĺ¤ăŻVec
ăŤć źç´ăăă$ None
ăŻăĺ
ăŽĺ¤ăă¤ăăŹăźăżăŤăăŁăŚçćăăăăă¨ăćĺłăăžăă ăăăŤăăăăŻăăźă¸ăŁăźăŻăăŽĺ ´ă§ĺ¤ăć´ć°ăăăă Vec
ăăĺ¤ă秝ĺăăăă¨ăă§ăăžăă ăăăć¸ăăŚăăă¨ăăŤă drain_filter
ăŽčŚłçšăăĺŽčŁ
ă§ăăăăăç§ăŽăăźă¸ă§ăłă§ăŻĺŽéăŤăŻä˝ăčż˝ĺ ăăăŞăăă¨ăŤć°äťăăžăăă
fn drain_filter_map<F>(
&mut self,
mut f: F,
) -> DrainFilter<T, impl FnMut(&mut T) -> bool>
where
F: FnMut(&T) -> Option<T>,
{
self.drain_filter(move |value| match f(value) {
Some(new_value) => {
*value = new_value;
false
}
None => true,
})
}
éăŤă drain_filter
ăŽçľćăăăăăłă°ăăăŽă¨ĺăă§ăăăăăăăŞăăŽč§ŁéăŻăăžă彚ăŤçŤăăŞăă¨ćăŁăŚăăžăăăăç§ăŻăăăć¸ăčžźăăă¨ăăžăăăăĺăççąfilter_map
ăŻăăă§ăŻăăăžăăă t filter
ăŽĺžăŤmap
ăĺźăłĺşăăŽă¨ĺăă§ăă
@ johnw42ăăăăăăăăŞăăŻNone
ăăĺ¤ăVec
ăŤçăžăăšăă§ăăăă¨ăćĺłăăăă¨ćăŁăăŽă§ăă
ăăăăŁăŚăäşşé塼ĺŚçă§ăŻăŞăăăăăăžăăăă FnMut(T) -> Result<U, T>
ăćăä¸čŹçă§ăăăăăŤćăăăžăă FnMut(&mut T) -> Option<U>
ăŻĺŽéăŤăŻăŞăăˇă§ăłă§ăŻăăăžăăăăăăŻăä¸čŹçăŞăąăźăšă§ăŻT
ăŽćć樊ăĺĺžă§ăăŞăăăă§ăă FnMut(T) -> Result<U, T>
ă¨FnMut(&mut T) -> bool
ăĺŻä¸ăŽé¸ćč˘ă ă¨ćăăžăă
@timvermeulenç§ăŻäťĽĺăŤăćăä¸čŹçăŞă解湺çăŤă¤ăăŚä˝ăăč¨ăĺ§ăăžăăăăăăŚç§ăŽăćăä¸čŹçăŞă解湺çăŻăăŞăăŽăăŽă¨ăŻç°ăŞăăžăăăăăăç§ăŻĺăçľčŤăŤéăăžăăăĺŽéăŤăŻä˝żăăăăŞăă§ăăăă
ä¸ç´ăŚăźăśăźăä¸ăŤĺŞăăć˝čąĄĺăć§çŻă§ăăé常ăŤä¸čŹçăŞćšćłăä˝ćăăăă¨ăŤăŻăăžă ăăç¨ĺşŚăŽäžĄĺ¤ăăăăăăăăžăăăă ç§ăŽçĽăéăă drain
ă¨drain_filter
ăŽăă¤ăłăăŻăăăăăçšăŤäşşé塼ĺŚăŤĺşăĽăăAPIă§ăăă¨ăăăă¨ă§ăŻăŞăăăăă§ăŻăăăžăăăă硴çżăăŚăă ăăăăăăŻăĺ¤ăăŽĺéˇăŞĺăăăŞăăă°ďźăžăăŻĺŽĺ
¨ă§ăŞăćä˝ă使ç¨ăăŚďźäťăŽćšćłă§ć¸ăăă¨ăŻă§ăăžăăă
drain
ă使ç¨ăăă¨ă揥ăŽĺŞăăăăăăăŁăĺĺžă§ăăžăă
Vec
Copy
ăžăăŻClone
ăăľăăźăăăĺż
čŚăŻăăăžăăăVec
čŞä˝ăŽăĄă˘ăŞăĺ˛ăĺ˝ăŚăă解ćžăăăăăĺż
čŚăŻăăăžăăăVec
ăŤćŽăŁăŚăăĺ¤ăŻăć大ă§1ĺă ă秝ĺăăăžăădrain_filter
ă使ç¨ăăă¨ăéŁçśăăçŻĺ˛ă ăă§ăŞăă Vec
ăăäťťćăŽă˘ă¤ăă ăŽăťăăăĺé¤ăăăă¨ăă§ăăžăă ăăžăćç˝ă§ăŻăŞăĺŠçšăŻăéŁçśăăçŻĺ˛ăŽă˘ă¤ăă ăĺé¤ăăăĺ ´ĺă§ăă drain
ăŤć¸ĄăçŻĺ˛ăčŚă¤ăăăăăŤă Vec
ăäťăăŚĺĽăŽăăšăä˝ćăăĺż
čŚăăăĺ ´ĺă drain_filter
ăŻăăăŠăźăăłăšăĺä¸ăăăăă¨ăă§ăăăă¨ă§ăăăăŽĺ
厚ăć¤ćťăăăăăŽVec
ă ăŻăăźă¸ăŁăŽĺźć°ăŻ&mut T
ă§ăăăăă Vec
ăŤćŽăŁăŚăăă˘ă¤ăă ăć´ć°ăăăă¨ăĺŻč˝ă§ăă ăăŁăăźďź
drain_filter
ăŽăăăŞă¤ăłăăŹăźăšćä˝ă§ĺŽčĄăăăäťăŽăăă¤ăăŽăă¨ă揥ăŤç¤şăăžăă
ăăăŚăăăăăăăăăŽç§ăŽĺćă§ăďź
Vec
ăăĺé¤ăăăĺžăŤăŽăżĺ¤ăĺźăłĺşăĺ
ăŤé
俥ăăăă¨ăŤăăăĺ¤ăŽăŻăăźăłĺăĺéżăăă¨ăăă¤ăăŹăźăżăźăŽçŽçăçĄĺšăŤăŞăăžăăVec
ăŽă˘ă¤ăă ăŽăăăăăŁăçśćăăăă¨ăŻä¸ĺŻč˝ă§ăăăăă彚ăŤçŤăăŞăă¨ĺ¤ćăăžăăă Vec
ăć§çŻăăăăăĺż
ăăăĺšççă§ăăă¨ăŻéăăăăăăŤćŞăĺ ´ĺăăăăžăăVec
ăăć¤ćťăĺć˘ăăăŤă˘ă¤ăă ăŽĺ¤§é¨ĺăăšăăăă§ăăăăăŤçˇ¨ćăăăŚăăĺ ´ĺăŤĺ˝šçŤăĄăžăă 䝼ä¸ăŽăľăłăăŤăłăźăăŤăŻĺŤăăžăăă§ăăăăăŻăăźă¸ăŁăźăĺ¤ć´ăăŚăçśčĄăăĺăŤă¸ăŁăłăăă揥ăŽă˘ă¤ăă ăŽć°ăćĺŽăăčż˝ĺ ăŽusize
ăčżăăă¨ă§ăľăăźăă§ăăžăăusize
ăŻă Keep(usize)
ăžăăŻDrop(usize)
ăŽé¸ćăŤç˝Žăćăăăă¨ăă§ăăžăďźăăă§ă Keep(0)
ă¨Drop(0)
ăŻćĺłçăŤă§ăďźĺçďźăăŻăăźă¸ăŁăźăŤ4ă¤ăŽăąăźăšăŽĺćĺăčżăăăăŤăăăă¨ă§ăĺşćŹçăŞăŚăźăšăąăźăšăăľăăźăă§ăăă¨ćăăžăă
fn super_drain(&mut self, f: F) -> SuperDrainIter<T>
where F: FnMut(&mut T) -> DrainAction<T>;
enum DrainAction<T> {
/// Leave the item in the Vec and don't return anything through
/// the iterator.
Keep,
/// Remove the item from the Vec and return it through the
/// iterator.
Remove,
/// Remove the item from the Vec, return it through the iterator,
/// and swap a new value into the location of the removed item.
Replace(T),
/// Leave the item in place, don't return any more items through
/// the iterator, and don't call the closure again.
Stop,
}
ç§ăć示ăăăćĺžăŽăŞăăˇă§ăłăŽ1ă¤ăŻăă¤ăăŹăźăżăźăĺŽĺ ¨ăŤĺăé¤ăăă˘ă¤ăă ăĺ¤ă§ăŻăăźă¸ăŁăźăŤć¸Ąăăĺźăłĺşăĺ ăă˘ă¤ăă ăăăčŞä˝ăŤç˝Žăćăăăă¨ă§ă˘ă¤ăă ăĺ¤ć´ăăŞăăăăŤăăăă¨ă§ăă
fn super_drain_by_value(&mut self, f: F)
where F: FnMut(T) -> DrainAction<T>;
enum DrainAction<T> {
/// Don't replace the item removed from the Vec.
Remove,
/// Replace the item removed from the Vec which a new item.
Replace(T),
Stop,
}
ăăŽă˘ăăăźăăŻăˇăłăăŤă§ăăăšăŚĺăăŚăźăšăąăźăšăăľăăźăăăŚăăăăăç§ăŻăăŽă˘ăăăźăăćăć°ăŤĺ
ĽăŁăŚăăžăă ć˝ĺ¨çăŞćŹ çšăŻăăťă¨ăăŠăŽă˘ă¤ăă ăćĺŽăŽä˝ç˝ŽăŤćŽăŁăŚăăĺ ´ĺă§ăăăŻăăźă¸ăŁăźăŽăšăżăăŻăăŹăźă ăŤç§ťĺăăŚăăŻăăźă¸ăŁăźăćťăŁăă¨ăăŤĺ
ăŤćťăĺż
čŚăăăăă¨ă§ăă ăŻăăźă¸ăŁăźăĺźć°ăčżăă ăă§ăăăăăŽĺăă確ĺŽăŤćéŠĺăăăăă¨ăéĄăŁăŚăăžăăăăăăäżĄé źă§ăăăăŽăăŠăăăŻăăăăžăăă äťăŽäşşăăăăĺŤăăăŽăŤĺĺć°ăŤĺ
ĽăŁăŚăăĺ ´ĺăŻă update
ăéŠĺăŞĺĺăŤăŞăă¨ćăăžăăç§ăééăŁăŚăăŞăăă°ăăˇăłă°ăŤăăšăŽă¤ăłăăŹăźăšć´ć°ăĺŽčŁ
ăăăăăŤä˝żç¨ă§ăăăăă§ăă Vec
ăŽĺ
厚ă
ďźă¨ăăă§ăăăŽĺˇăŽăżă¤ăăŤăčŚăăžă§ăŻăä¸č¨ăŽăŞăłăŻăŞăšăăĺŽĺ ¨ăŤĺżăăŚăăăŽă§ăĺŽĺ ¨ăŤçĄčŚăăžăăăăŞăłăŻăŞăšăăŤă¤ăăŚčŠąăăŚăăă¨ăăă¤ăłă4ă6ăŽĺćăĺ¤ăăăŽă§ăĺĽăŽăă¨ăčăăžăă APIăŻăŞăłăŻăŞăšăăŤéŠăăŚăăžăăďź
@ johnw42 mem::replace
ăžăăŻmem::take
ă使ç¨ăăŚăĺ¤ć´ĺŻč˝ăŞĺç
§ăăăĺ ´ĺăŻăăă§ăŤ3.ăĺŽčĄă§ăăžăă
@ johnw42 @jplatte
ďź3ďźčżăăăIterator
ăŽă˘ă¤ăă ăżă¤ăăăłăŹăŻăˇă§ăłăŽă˘ă¤ăă ăżă¤ăă¨ç°ăŞăăăŽăŤăăĺ ´ĺăŤăŽăżăĺŽéăŤćĺłăăăăžăă
ďź3ďźăŻçšćŽăŞăąăźăšă§ăăăăăŻă Iterator
ăăčŚç´ ăčżăăć°ăăčŚç´ ăVec
ăŤćťăăăă§ăă
Bikesheddingďź Replace(T)
ăŽé˘ć°ăéăŤăăŚă PushOut
ăŽĺ
é¨ĺ¤ăă¤ăăŹăźăżăŤăé俥ăăăçŽçă§ă PushOut(T)
ăŤç˝Žăćăăžăă Vec
ăŽĺ
ăŽďźăăŠăĄăźăżďźă˘ă¤ăă ă
Stop
ăŻăăăăăError
ăżă¤ăăčżăćŠč˝ăĺăăŚăăĺż
čŚăăăăžăďźăžăăŻtry_fold
ăŽăăăŤćŠč˝ăăžăăďźďźă
ć¨ĺ¤super_drain_by_value
é˘ć°ăĺŽčŁ
ăăăăă¤ăăŽăă¨ăĺŚăłăžăăă
čŚĺşăăŽé
çŽăŻăĺ°ăŞăă¨ăVec
ăŽĺ ´ĺăăăă§čŠąăăŚăăăă¨ăŻăăšăŚăăăă¨ăăăăŤăă´ăŞăŤăăăŻăă§ăďźć šćŹçăŤć°ăăćŠč˝ăčż˝ĺ ăăăŽă§ăŻăŞăďźă Vec
ăŻăć˘ĺăŽAPIăäťăăŚăĺşćŹçăŤăăšăŚăŽăăŁăźăŤăă¸ăŽç´ćĽăŽčŞăżĺăăăăłć¸ăčžźăżă˘ăŻăťăšăăă§ăŤćäžăăŚăăžăă ĺŽĺŽçă§ăŻă犺ăŽVec
ăŽăă¤ăłăżăăŁăźăŤăăçŁčŚă§ăăŞăă¨ăăĺ°ăăŞčŚĺăăăăžăăăä¸ĺŽĺŽăŞinto_raw_parts
ăĄă˝ăăăŻăăŽĺśéăĺăé¤ăăžăă ç§ăăĄăćŹĺ˝ăŤčŠąăăŚăăăŽăŻăĺŽĺ
¨ăŞăłăźăăŤăăŁăŚĺšççăŤĺŽčĄă§ăăä¸éŁăŽćä˝ăćĄĺźľăăăă¨ă§ăă
ăłăźăçćăŤé˘ăăŚăŻăç°ĄĺăŞăąăźăšďź Vec<i32>
ăŞăŠďźă§ăŻă Vec
ăŤĺşĺ
ĽăăăĺéˇăŞç§ťĺăŻĺéĄă§ăŻăŞăăăăŽĺźăłĺşăăŻćŹĄăŽăăăŞĺç´ăŞăăŽăŤăŞăăă¨ăăăăăžăăăăăźăŞăăŹăźăˇă§ăłăžăăŻVec
ăŽĺăć¨ăŚăŻăĺç´ăăăŚćšĺă§ăăŞăăłăźăăŤĺ¤ćăăăžăďźăăăăăźăĺ˝äť¤ă¨3ĺ˝äť¤ďźă ćŞăăăĽăźăšăŻăăăéŁăăăąăźăšă§ăŻăç§ăŽććĄă¨drain_filter
ăĄă˝ăăăŽä¸Ąćšăĺ¤ăăŽä¸čŚăŞăłăăźăĺŽčĄăăăĄă˝ăăăŽçŽçă大ăăćăŞăăă¨ă§ăă Vec<[u8; 1024]>
ăŤĺŻžăăŚçćăăăă˘ăťăłăăŞăłăźăă調ăšăŚăăăăăšăăăžăăăăŠăĄăăŽĺ ´ĺăăĺĺ垊ăŤăŻăćéŠĺăăăŚăăŞămemcpy
ă¸ăŽ2ă¤ăŽĺźăłĺşăăăăăžăă no-opĺźăłĺşăă§ăăăăăăăĄĺ
¨ä˝ă2ĺăłăăźăăăă¨ăŤăŞăăžăă
äşşé塼ĺŚăŽčŚłçšăăčŚăă¨ăä¸čŚăăă¨ăăŞăčŚć ăăŽăăç§ăŽAPIăŻăĺŽéăŤăŻăăăťăŠčŻăăăăžăăă ăŻăăźă¸ăŁăăĺćĺ¤ăčżăăă¨ăŻăćăĺç´ăŞĺ ´ĺăé¤ăăŚăăŞăĺéˇăŤăŞăăăŻăăźă¸ăŁăĺćĺ¤ăŽăă˘ăčżăă¨ăăç§ăććĄăăăăŞă˘ăłăăŻăăăŤéăă§ăă
ăžăă DrainAction::Stop
ăćĄĺźľăăŚă super_drain_by_value
Option<R>
ďź$ă¨ăăŚčżăăăR
ĺ¤ăäżćăăăă¨ăăžăăăăăăăŻăăăŤćŞăăă¨ă§ăăćťăĺ¤ăä¸čŚăŞĺ ´ĺăăłăłăă¤ăŠăźăŻR
ăć¨ć¸Źă§ăăă使ç¨ăăŚăăŞăĺ¤ăŽăżă¤ăăŤć示çăŤćł¨éăäťăăĺż
čŚăăăăžăă ăăŽăăăăŻăăźă¸ăŁăźăăĺźăłĺşăĺ
ăŤsuper_drain_by_value
ăŽĺ¤ăčżăăă¨ăăľăăźăăăăŽăŻčŻăčăă§ăŻăŞăă¨ćăăžăă ăăăŻă loop {}
ć§é ăĺ¤ăčżăăă¨ăă§ăăççąă¨ăťăźĺăă§ăăăäťăŽç¨ŽéĄăŽăŤăźăăŻ()
ă¨čŠäžĄăăăžăă
ä¸čŹć§ăŤé˘ăăŚăŻăĺŽéăŤăŻ2ă¤ăŽăąăźăšăćŠćçľäşăăăă¨ăŤć°äťăăžăăă1ă¤ăŻćŽăăŽVec
ăĺé¤ăăăăă1ă¤ăŻăăŽăžăžćŽăăăžăă ćŠćçľäşăĺ¤ăćăăŞăĺ ´ĺďźç§ăăăăăšăă§ăŻăŞăă¨ćăăŽă§ďźăćĺłçăŤKeep(n)
ăžăăŻDrop(n)
ăčżăăă¨ă¨ĺçăŤăŞăăžăăăăă§ă n
ăŻăžă ć¤č¨ăăăŚăăŞăé
çŽă ăă ăă Keep
/ Drop
ă使ç¨ăăĺ ´ĺă¨ćŻčźăăŚăăăĺç´ăŞăłăźăăăšă使ç¨ăăćšă使ăăăăăăăćŠćçľäşăŻĺĽăŽăąăźăšă¨ăăŚćąăĺż
čŚăăăă¨ćăăžăă
APIăăăĺ°ă使ăăăăăăăăăŤăăŻăăźă¸ăŁăźă()
ăčżăăăăŤăăźăŞăă¸ă§ăŻăďźăăă§ăŻăă˘ăăăăźăżăźăă¨ĺźăłăžăďźă渥ăăă¨ăăĺ§ăăăžăă Vec
ăŽĺčŚç´ ăć¤ćťăăăăăŤä˝ă辡ăăăăĺśĺžĄăăăăăŤä˝żç¨ăăăžăă ăăăăŽăĄă˝ăăăŤăŻă borrow
ă borrow_mut
ă take
ăŞăŠăŽä˝żăć
Łăăĺĺăäťăă keep_next(n)
ădrop_remainder()
ăŞăŠăŽčż˝ĺ ăŽăĄă˝ăăăäťăăăă¨ăă§ăăžăă ăăŽç¨ŽăŽAPIă使ç¨ăăă¨ăĺç´ăŞăąăźăšă§ăŻăŻăăźă¸ăŁăźăăŻăăăŤĺç´ăŤăŞăăč¤éăŞăąăźăšă§ăŻăŻăăźă¸ăŁăźăč¤éăŤăŞăăžăăă ă˘ăăăăźăżăźăŽăĄă˝ăăăŽăťă¨ăăŠăĺ¤ă§self
ăĺăăăăŤăăăă¨ă§ăĺźăłĺşăĺ
ătake
ăč¤ć°ĺĺźăłĺşăăăžăăŻĺžçśăŽĺ垊ă§ä˝ăăăăăŤă¤ăăŚççžăăć示ăä¸ăăăŞăŠăŽăă¨ăç°ĄĺăŤé˛ăăă¨ăă§ăăžăă
ăăăăç§ăăĄăŻăžă ăăŁă¨ăăžăăăăă¨ăă§ăăžăďź äťćăăăăăăă¨ă§ăăăăăŽĺéĄăŻé˘ć°ĺč¨čŞă§ç˘şĺŽăŤč§ŁćąşăăăĺéĄăŤéĄäźźăăŚăăăéĄäźźăŽč§Łćąşçă§č§Łćąşă§ăăăă¨ăŤć°ăĽăăžăăă ç§ăŻăă¸ăăăźăAPIăŤă¤ăăŚčŠąăăŚăăžăăćĺăŻăăŽçăčŤćă§OCamlăŽăľăłăăŤăłăźăă§čŞŹćăăăăăă§ăŻHaskellăłăźăă¨äťăŽé˘éŁăăčŤćă¸ăŽăŞăłăŻă§čŞŹćăăăŚăăžăă ă¸ăăăźăŻăăăźăżć§é ăăăŠăăźăšăăçšĺŽăŽăăźăżć§é ăăľăăźăăăćä˝ă使ç¨ăăŚăă¤ăłăăŹăźăšăă§ć´ć°ăăăăăŽé常ăŤä¸čŹçăŞćšćłăćäžăăžăă ĺĽăŽčŚćšăăăă°ăă¸ăăăźăŻăçšĺŽăŽăżă¤ăăŽăăźăżć§é ăŤĺŻžăăŚćä˝ăĺŽčĄăăăăăŽčż˝ĺ ăŽăĄă˝ăăăĺăăä¸ç¨ŽăŽăżăźăăăŁăźă¸ăŁăźäťăă¤ăăŹăźăżăźă§ăă
Haskellă§ăŻăă¸ăăăźăă˘ăăăŤăăăă¨ă§ăă¤ăłăăŹăźăšăăťăăłăăŁăŻăšăĺĺžăăžăă Rustă§ăŻăă¸ăăăźăŤVec
mut
ĺç
§ăäżćăăăăă¨ă§ăăŠă¤ăăżă¤ă ă使ç¨ăăŚĺăăă¨ăčĄăăă¨ăă§ăăžăă Vec
ăŽă¸ăăăźăŻăä¸č¨ă§čŞŹćăăă˘ăăăăźăżăźă¨é常ăŤäźźăŚăăžăăăăŻăăźă¸ăŁăźăŤçš°ăčżă渥ăăŽă§ăŻăŞăă Vec
ăăăčŞä˝ăŤă¸ăăăźăä˝ćăăăĄă˝ăăăćäžăăă ăă§ăăă¸ăăăźăŻăĺĺ¨ăăéăă Vec
ăŤćäťçăŤă˘ăŻăťăšă§ăăžăă 揥ăŤăĺźăłĺşăĺ
ăŻăé
ĺăăăŠăăźăšăăăŤăźăăä˝ćăăĺăšăăăă§ăĄă˝ăăăĺźăłĺşăăŚăçžĺ¨ăŽă˘ă¤ăă ăVec
ăăĺé¤ăăăăăăŽăžăžăŤăăžăă ă¸ăăăźă使ç¨ăăăĄă˝ăăăĺźăłĺşăăă¨ă§ăćŠćçľäşăĺŽčŁ
ă§ăăžăă ăŤăźăăŻĺźăłĺşăĺ
ăŽĺśĺžĄä¸ăŤăăăăăăŤăźăăŽĺĺ垊ă§č¤ć°ăŽă˘ă¤ăă ăĺŚçăăăăăŤăźăăăžăŁăă使ç¨ăăăŤĺşĺŽć°ăŽă˘ă¤ăă ăĺŚçăăăăăăă¨ăĺŻč˝ăŤăŞăăžăă
ăăăŻăă¸ăăăźăĺŽčĄă§ăăăă¨ăŽăăă¤ăă示ăé常ăŤĺˇĽĺ¤Ťăăăäžă§ăă
/// Keep the first 100 items of `v`. In the next 100 items of `v`,
/// double the even values, unconditionally keep anything following an
/// even value, discard negative values, and move odd values into a
/// new Vec. Leave the rest of `v` unchanged. Return the odd values
/// that were removed, along with a boolean flag indicating whether
/// the loop terminated early.
fn silly(v: &mut Vec<i32>) -> (bool, Vec<i32>) {
let mut odds = Vec::new();
// Create a zipper, which get exclusive access to `v`.
let mut z = v.zipper();
// Skip over the first 100 items, leaving them unchanged.
z.keep_next(100);
let stopped_early = loop {
if let Some(item /* &mut i32 */) = z.current_mut() {
if *item < 0 {
// Discard the value and advance the zipper.
z.take();
} else if *item % 2 == 0 {
// Update the item in place.
*item *= 2;
// Leave the updated item in `v`. This has the
// side-effect of advancing `z` to the next item.
z.keep();
// If there's another value, keep it regardless of
// what it is.
if z.current().is_some() {
z.keep();
}
} else {
// Move an odd value out of `v`.
odds.push(z.take());
}
if z.position() >= 200 {
// This consumes `z`, so we must break out of the
// loop!
z.keep_rest();
break true;
}
} else {
// We've reached the end of `v`.
break false;
}
}
(stopped_early, odds)
// If the zipper wasn't already consumed by calling
// `z.keep_rest()`, the zipper is dropped here, which will shift
// the contents of `v` to fill in any gaps created by removing
// values.
}
ćŻčźăŽăăăŤă drain_filter
ă使ç¨ăăăťăźĺăé˘ć°ă示ăăžăăăăăăŻćŠćăŤĺć˘ăăăľăăăăă ăă§ăă ăťăźĺăéăŽăłăźăă§ăăăăŻăăźă¸ăŁăźăŤăăŁăŚčżăăăĺ¤ăŽćĺłăć確ă§ăŻăŞăăĺŻĺ¤ăŽăăźăŤăăŠă°ă使ç¨ăăŚăăăĺ垊ăă揥ăŽĺ垊ăŤć
ĺ ąăäźéăăăăăç§čŚă§ăŻčŞăżăŤăăăŞăŁăŚăăžăăăăźă¸ă§ăłăŻăĺśĺžĄăăăźă§ĺăăă¨ăĺŽçžăăžăă ĺé¤ăăăă˘ă¤ăă ăŻĺ¸¸ăŤă¤ăăŹăźăżăźăŤăăŁăŚçćăăăăăăĺşĺăăč˛ ăŽĺ¤ăĺé¤ăăăăăŤĺĽăŽăăŁăŤăżăźăšăăăăĺż
čŚă§ăăă¤ăžăă1ă¤ă§ăŻăŞă2ă¤ăŽĺ ´ćă§č˛ ăŽĺ¤ăăă§ăăŻăăĺż
čŚăăăăžăă v
ăŽä˝ç˝Žă追补ăăŞăăă°ăŞăăŞăăŽăăĄăăŁă¨éăă§ăă drain_filter
ăŽĺŽčŁ
ăŤăŻăăŽć
ĺ ąăăăăžăăăĺźăłĺşăĺ
ăŻăăŽć
ĺ ąăŤă˘ăŻăťăšă§ăăžăăă
fn drain_filter_silly(v: &mut Vec<i32>) -> (bool, Vec<i32>) {
let mut position: usize = 0;
let mut keep_next = false;
let mut stopped_early = false;
let removed = v.drain_filter(|item| {
position += 1;
if position <= 100 {
false
} else if position > 200 {
stopped_early = true;
false
} else if keep_next {
keep_next = false;
false
} else if *item >= 0 && *item % 2 == 0 {
*item *= 2;
false
} else {
true
}
}).filter(|item| item >= 0).collect();
(stopped_early, removed)
}
@ johnw42䝼ĺăŽć稿ă§ă scanmut
ăŻăŹăźăăçšăŤRemover
ć§é ä˝ăćăĺşăăžăăăăăŞăăč¨ĺăăăă¸ăăăźăăŽćŚĺżľăŻăé常ăŤäźźăŚăăăăă§ăă ăăăŻăĺŽĺ
¨ăŞĺśĺžĄăĺż
čŚăŞă¨ăăŤăŻăăźă¸ăŁă使ç¨ăăćšćłăăăăŻăăăŤäşşé塼ĺŚçă§ăăăăăŤćăăăžăă
ăăăăŤăăăăăăŻăăăădrain_filter
ăĺŽĺŽăăăĺż
čŚăăăăăŠăăă¨ăŻăăžăé˘äżăăăăžăăăăăăŻăĺžă§ăă¤ă§ăĺ
é¨ă交ćă§ăăăăă§ăă drain_filter
čŞä˝ăŻăé常ăŤäžżĺŠă§ăăăăă常ăŤé常ăŤäžżĺŠă§ăă ĺŽĺŽĺăŽĺăŤç§ăăžă čŚăăĺŻä¸ăŽĺ¤ć´ăŻă RangeBounds
ăăŠăĄăźăżăźă§ăă
@timvermeulen RangeBounds
ăăŠăĄăźăżăźăčż˝ĺ ăăăŽăŻçăŤăăŞăŁăŚăăă¨ćăăžăăăçžĺ¨ăŽăŻăăźă¸ăŁăźç˝˛ĺďź F: FnMut(&mut T) -> bool
ďźăŻäżćăăžăă
ćĺşăăăčŚç´ ăŻă filter_map
ăžăăŻĺż
čŚăŞăăŽă§ăă¤ă§ăĺžĺŚçă§ăăžăă
ďźç§ăŤă¨ăŁăŚă retain
ăŻčŚç´ ă訹ĺŻăăŞăăăăăŻăăźă¸ăŁăźăčŚç´ ăŽĺ¤ć´ă訹ĺŻăăăă¨ăé常ăŤéčŚă§ăďźăăŽééăăçşčŚăăăĺăŤĺŽĺŽĺăăăžăăďźă
ăăăăăăŻäžżĺŠăă¨ćç¨ć§ăŽéăŽĺŽç§ăŞăăŠăłăšăŽăăă§ăă
@timvermeulenăăăç§ăŻăĄă¤ăłăăăăŻăăăăŞăé˘ăăŚăăžăăă
ĺ
ăŽăăăăŻăŤé˘éŁăăŚăăăă¨ăŤć°äťăăăŽăŻăăŻăăźă¸ăŁăźăŽćťăĺ¤ăä˝ăćĺłăăăŽăăćăĺşăăŽăéŁăăă¨ăăăă¨ă§ăăă¤ăžăăă˘ă¤ăă ăäżćăăăĺé¤ăăăă示ăăŚăăăŽă§ăăăăă v.drain_filter(p)
ăŻv.iter().filter(p)
ă¨ĺçă§ăăăĺŻä˝ç¨ăăăăă¨ăăăăĽăĄăłăăććăăŚăăă¨äžżĺŠă ă¨ćăăžăă
filter
ăŽĺ ´ĺăăăźăŤĺ¤ă使ç¨ăăăă¨ăŻć確ăŤăăăăăŤăžă çćłçă§ăŻăăăžăăăăăăăŻé常ăŤăăçĽăăăŚăăé˘ć°ă§ăăăčż°čŞăăăăăäżćăăĺż
čŚăăăăžăăďźăă¨ăă質ĺăŤçăăăŽăŻĺ°ăŞăă¨ăăăç¨ĺşŚç´ćçă§ăă ăăăăć¨ăŚăăšăăăă§ăŻăŞă drain_filter
ăŽĺ ´ĺăă¤ăăŹăźăżăŽčŚłçšăăčăăă¨ĺăăă¸ăăŻăéŠç¨ăăăžăăăĺ
ĽĺVec
ăŽčŚłçšăăčăăă¨ă質ĺăŻăăăšăă§ăŻăŞăăăŤăŞăăžăăćăŁăŚăăŚďź"
ćŁç˘şăŞčĄ¨çžăŤă¤ăăŚăŻă filter
ăăŠăĄăźăżăźăŽĺĺăpredicate
ăŤĺ¤ć´ăďź Iterator::filter
ă¨ä¸č´ăăăăăŤďźă誏ćăŽăŠăăăŤăăŽćăčż˝ĺ ăăăă¨ăććĄăăžăă
predicate
ăŽćťăĺ¤ăăŠăŽăăăŤä˝żç¨ăăăăăčŚăăŚăăă¨ădrain_filter
ăŻIterator::filter
ă¨ĺăă§ăăăé¸ćăăăăŽăĺé¤ăăă¨ăăčż˝ĺ ăŽĺŻä˝ç¨ăăăăă¨ăŤćł¨ćăăŚăă ăăăself
ăăăŽă˘ă¤ăă ă
@ johnw42ăŻăăčŻăçšă§ăă drain_where
ăŽăăăŞĺĺăŽćšăăŻăăăŤăăăăăăă¨ćăăžăă
ăă¤ăŻăˇă§ăăŁăłă°ăŤĺĺăäťăăĺ ´ĺăŻă ăăšăŚăŽăłăĄăłăăčŞăă ăă¨ă確čŞăăŚăă ăăă é ăăăăăŽă§ăăă ĺ¤ăăŽăăŞă˘ăłăăăă§ăŤććĄăăăŚăăžăăăă¨ăă°ă https ďź//github.com/rust-lang/rust/issues/43244#issuecomment -331559537
ăăăâŚăăăŻdraintain()
ă¨ăăĺĺă§ăŞăăă°ăŞăăžăăďź ăăăťăŠçžăăĺĺăŻäťăŤăăăžăăďź
ç§ăŻăăŽĺéĄăŤé常ăŤčĺłăăăăăšăŹăăĺ ¨ä˝ăčŞăă ăŽă§ăăăăĺŽĺŽăăăŽăĺŠăăăă¨ăćĺž ăăŚăăżăăŞăč¨ăŁăăă¨ăčŚç´ăăăă¨ćăăăăăăžăăă éä¸ă§čŞĺăŽăłăĄăłăăăăă¤ăčż˝ĺ ăăžăăăăă§ăăă ăä¸çŤăŤäżă¤ăăăŤăăŚăăžăă
ăăăç§ăććĄăăĺĺăŽćčŚăŽăŞăčŚç´ă§ăďź
drain_filter
ďźçžĺ¨ăŽĺŽčŁ
ă§ä˝żç¨ăăăŚăăĺĺă filter_map
ăŞăŠăŽäťăŽĺĺă¨ä¸č´ăăžăă drain().filter()
ăŤéĄäźźăăŚăăă¨ăăĺŠçšăăăăžăăăăăĺ¤ăăŽĺŻä˝ç¨ăăăăžăădrain_where
ďź true
ă_out_ăćĺşăăăă_in_ăăăŁăŤăżăŞăłă°ăăăă示ăă¨ăăĺŠçšăăăăžăăăăăŻăäťăŽĺĺă§ăŻčŚăăŤăăĺ ´ĺăăăăžăă _where
ćĽĺ°žčžăŽstd
ăŤăŻĺäžăŻăăăžăăăăĺć§ăŽćĽĺ°žčžăŽĺäžăŻăăăăăăăžăăwhere
ăŻăă§ăŤăăźăŻăźăă§ăăăăă drain().where()
ăŽăăŞă¨ăźăˇă§ăłădrain_retain
ďź retain
ă¨ä¸č´ăăžăăă retain
ă¨drain
ăŻăăŻăăźă¸ăŁăŤăăŁăŚčżăăăăăźăŤĺ¤ăŽč§Łéăéă§ăăăăă桡䚹ăăĺŻč˝ć§ăăăăžăăfiltered_drain
drain_if
drain_when
remove_if
drain
ă¨ăŽä¸č˛Ťć§ăäżă¤ăăăŤăçŻĺ˛ĺźć°ăčż˝ĺ ăă䞥ĺ¤ăăăăăăăăžăăă
FnMut(&mut T) -> bool
ă¨FnMut(T) -> Result<T, U>
ăŽ2ă¤ăŽăŻăăźă¸ăŁăźĺ˝˘ĺźăććĄăăăŚăăžăă ĺžč
ăŻăăćčťć§ăăăăžăăăä¸ĺ¨ç¨ă§ăăăăžăă
ăăźăŤćĄäťśďź true
ăŻă Vec
ăçśćăăăăćĺłăăžăďźăé蝢ăăăŚretain
ă¨ä¸č´ăăăăă¨ăč°čŤăăăžăăăă drain
ă¨ä¸č´ăăžăăă true
ăŻăă Vec
ăăăŽćĺşăăćĺłăăžăďźă
ăăŁăŤăżăŻăăźă¸ăŁăăăăăŻăŤăŞăă¨ă DrainFilter
ă¤ăăŹăźăżăĺé¤ăăăžăă ăăŽĺžăă¤ăăŹăźăżăŻVec
ăŽćĺşăçľäşăăĺż
čŚăăăăžăăăăăŽăăăŤăŻăăăŁăŤăżăŻăăźă¸ăŁăĺ庌ĺźăłĺşăĺż
čŚăăăăäşéăŽăăăăŻăçşçăăăŞăšăŻăăăăžăă ăăă¤ăăŽč§ŁćąşçăăăăžăăăăăăăŻăăšăŚĺŚĽĺçšă§ăă
ăăăăă§ćć°´ăçľäşăăŞăă§ăă ăăă ăăăŻă find
ăall
ăŞăŠăŽă˘ăăăżăźă§ä˝żç¨ăăă¨ăăŞăç´ćăŤĺăăžăă ăăăŤăă¤ăăŹăźăżăć ć°ă§ăăăăă v.drain_filter(...);
ă¤ăăŁăŞă ă彚ăŤçŤăăŞăăŞăăžăă
常ăŤăăăăă§ćć°´ăçľäşăăžăă ăăăŻäşéăŽăăăăŻďźä¸çľśăŤă¤ăŞăăďźăŽăŞăšăŻăăăăžăăăĺä˝ăŽä¸č˛Ťć§ăäżăĄăžăă
çžĺ¨ĺˇťăćťăăăŚăăŞăĺ ´ĺăŤăŽăżăăăăăćăŤćć°´ăçľäşăăžăă ăăăŤăăăäşéăŽăăăăŻăĺŽĺ
¨ăŤäżŽćŁăăăžăăă drain_filter
ăŽĺä˝ăŻäşć¸Źă§ăăŞăăŞăăžăăăăšăăŠăŻăżăŤDrainFilter
ăăăăăăăă¨ăĺŽéăŤăŻćŠč˝ăăŞăĺ ´ĺăăăăžăă
ăăŁăŤăżăźăŽééăăăăăŻăŤăŞăăŞăăŁăĺ ´ĺăŤăŽăżăč˝ä¸ćăŤćć°´ăçľäşăăŚăă ăăă ăăăŻă drain_filter
ăŤăăŁăŚčĄăăăçžĺ¨ăŽĺŚĽĺćĄă§ăă ăăŽă˘ăăăźăăŽĺŞăăçšć§ăŻăăăŁăŤăżăźăŻăăźă¸ăŁăźăŽăç羥ăă§ăăăăŻăçşçăăăă¨ă§ăăăăăŻăăťăźééăăŞăé常ăŤç´ćçă§ăă
çžĺ¨ăŽĺŽčŁ
ăŻĺĽĺ
¨ă§ăăă DrainFilter
ć§é ä˝ăĺé¤ăăăŚăăéăăăŞăźăŻăăăă¨ăŻăăăžăăďźăă ăăă˘ăăźăăçşçăăĺŻč˝ć§ăăăăžăďźă ăă ăă䝼ĺăŽĺŽčŁ
ăŻĺŽĺ
¨/ăŞăźăŻăăŞăźă§ăŻăăăžăăă§ăăă
DrainIter
ăŻăăăăăăăăă¨ăăŤă˝ăźăšăăŻăăŤăŽćĺşăçľäşăăăă next
ăĺźăłĺşăăăă¨ăăŤăŽăżćĺşă§ăăžăďźé
ĺťśĺ垊ďźă
ăăŹăźăłăŞăłăăăăăćŻćăăč°čŤďź
drain
ăŽĺä˝ă¨ä¸č´ăăžăă
all
ă any
ă find
ăŞăŠăŽäťăŽă˘ăăăżăźă¨ăăžăç¸äşä˝ç¨ăăžăă
vec.drain_filter(...);
ă¤ăăŁăŞă ăćĺšăŤăăžăă
ăŹă¤ă¸ăźćŠč˝ăŻă drain_lazy
ăšăżă¤ăŤăŽăĄă˝ăăăžăăŻDrainIter
ăŽlazy()
ă˘ăăăżăźăäťăăŚć示çăŤćĺšăŤăăăă¨ăă§ăăžăďźăăăŤă Drain
ă§ăăä¸ä˝äşćć§ăăăăăăăĄă˝ăăăčż˝ĺ ăăžăďźă
ć ć°ăŞĺ垊ăćŻćăăč°čŤďź
äťăŽăťă¨ăăŠăăšăŚăŽă¤ăăŹăźăżă¨ä¸č˛Ťć§ăăăăžăă
ăăăŹă¤ăłăŞăłăăăăăćŠč˝ăŻă DrainIter
ăŽă˘ăăăżăźăäťăăŚăăžăăŻä¸čŹçăŞIterator::exhausting
ă˘ăăăżăźăäťăăŚć示çăŤćĺšăŤăăăă¨ăă§ăăžăďźRFC ďź2370ăĺç
§ďźă
ç§ăŻăăă¤ăăŽăăŽăčŚéăăăăăăăžăăăăĺ°ăŞăă¨ăăšăŹăăăăšăăăłă°ăăă¨ăăŤăăăć°ĺč ăŤĺ˝šçŤă¤ăă¨ăéĄăŁăŚăăžăă
@negamartin
drain-on-drop
ăŞăăˇă§ăłă§ăŻăă¤ăăŹăźăżăććĺ¤ă§ăŻăŞăă˘ă¤ăă ă¸ăŽĺç
§ăčżăĺż
čŚăăăăžăăăďź ăăŽăăăçšĺŽăŽćĄäťśăŤä¸č´ăăă˘ă¤ăă ăĺé¤ăăŚćć樊ăĺĺžăăăĄăŤăăşă ă¨ăăŚdrain_filter
ă使ç¨ăăăă¨ăŻä¸ĺŻč˝ăŤăŞăă¨ćăăžăďźăăăŻç§ăŽćĺăŽăŚăźăšăąăźăšă§ăăďźă
çžĺ¨ăŽĺŽčŁ ăŽĺä˝ăŻăććăăăŚăăĺ¤ăçćăăŞăăăćŁç˘şăŤăăăăăŞăłăăăăă§ăăăăăç§ăŻăăăŻćăăžăăă ăăăăŤăăăăăŹăźăłăŞăłăăăăăăŠăŽăăăŤčŚç´ ăĺç¨ăăĺż čŚăăăăŽăââăăăăŞăăŽă§ăăăŹăźăłăŞăłăăăăăŽćĺłăŤă¤ăăŚăŻ2ă¤ăŽç°ăŞăčăăăăă¨ćăăžăă
ć確ăŤăăăăăŤăăăŹă¤ăłăŞăłăăăăă¨ăŻăă¤ăăŹăźăżăĺŽĺ ¨ăŤćśč˛ťăăăŚăăŞăĺ ´ĺăŽĺä˝ăŽăżăćĺłăăžăăă¤ăăŹăźăżăĺŽĺ ¨ăŤćśč˛ťăăăŚăăŞăăŚăăăŻăăźă¸ăŁăŤä¸č´ăăăăšăŚăŽă˘ă¤ăă ăăăŹă¤ăłăăĺż čŚăăăăžăăďź ăăă¨ăăćśč˛ťăăăčŚç´ ăžă§ă ăă§ăćŽăăŻăăŽăžăžăŤăăžăăďź
çšăŤă揥ăŽéăăăăăžăă
let mut v = vec![1, 5, 3, 6, 4, 7];
v.drain_where(|e| *e > 4).find(|e| *e == 6);
// Drain-on-drop
assert_eq!(v, &[1, 3, 4]);
// Lazy
assert_eq!(v, &[1, 3, 4, 7]);
ă˘ă¤ăă˘ăć¨ăŚăă ăă§ăăăĺĽăŽĺŻč˝ăŞAPIăŻćŹĄăŽăăăŤăŞăăžăă
fn drain_filter_into<F, D>(&mut self, filter: F, drain: D)
where F: FnMut(&mut T) -> bool,
D: Extend<T>
{ ... }
äťăŽăŞăăˇă§ăłăăăćčťć§ăŻăăăžăăăă DrainFilter
ăăăăăăăăă¨ăăŤä˝ăăăăă¨ăăĺéĄăĺéżăăžăă
ç§ăŤăŻăăăŽăăšăŚăretain_mut()
ďźăŻăăźă¸ăŁăźăŤć¸ĄăăăĺŻĺ¤ĺç
§ăĺŤăretain()
ďźăŽăăăŤčŚăăŞăăŞăŁăŚăăăăăŤćăăžăăăăăŻăä˝ăăăăžăćäžăăăă¨ăçŽçă¨ăăŚăăžăăă ă ăăŁăŤăżăźäťăăăŹăłçŠăŽč¨č¨ăŤĺ ăăŚăäťăŽă¨ăăretain_mut()
ăćäžă§ăăžăăďź ăăă¨ăç§ăŻä˝ăăčśłăăŞăăŽă§ăăďź
@BartMassey
ăăăä˝ăăăăžăćäžăăăă¨ăćĺłăăăăŽă§ăă
ăăă§ăŻăŞăă¨ćăăžăă ç§ăŻçšăŤdrain_filter
ă使ç¨ăăŚăăăŁăŤăżăźĺşćşăŤĺşăĽăăŚă˘ă¤ăă ăŽćć樊ăĺĺžăăžăă Drain
ă¨DrainFilter
ăŻă˘ă¤ăă ăč˛ăăžăăăäżćăŻăăžăăă
@negamartin
ć確ăŤăăăăăŤăç§ăăăŹăźăłăŞăłăăăăă¨č¨ăă¨ăăç§ăŻă¤ăăŹăźăżăĺŽĺ ¨ăŤćśč˛ťăăăŚăăŞăă¨ăăŽĺä˝ăŽăżăćĺłăăžă
ăăăăăăăžăăă ăăăŻç§ăŽééăă§ăă ç§ăŻăăŞăăŽĺŽçžŠă誤解ăăžăăă ç§ăŻăăăăč˝ă¨ăăăăžă§ä˝ăvecăăĺé¤ăăăŞăăă¨č§ŁéăăžăăăăăăăŻĺŽéăŤăŻćĺłăăăăžăăă
ć ć°ăŞĺ垊ăćŻćăăč°čŤ
drain
ă¨ä¸č´ăăŚăăĺż
čŚăăăă¨ćăăžăă Iterator::exhausting
RFCăŻĺăĺ
Ľăăăăă drain
ă¨drain_filter
ăä¸čŚĺ寞ăŽăăŹă¤ăłĺä˝ăăăĺ ´ĺăŻé常ăŤĺĽĺŚăŤăŞăăžăă
@negamartin
drain_filterďźçžĺ¨ăŽĺŽčŁ ă§ä˝żç¨ăăăŚăăĺĺă filter_mapăŞăŠăŽäťăŽĺĺă¨ä¸č´ăăžăă
drain().filter()
ăŤéĄäźźăăŚăăă¨ăăĺŠçšăăăăžăăăăăĺ¤ăăŽĺŻä˝ç¨ăăăăžăă
ăăăŻéĄäźźăăŚăăžăăďźăăŽăăă retain_mut
/ drain_filter
ăĺż
čŚă§ăďźďź
drain().filter()
ăŻăăăŁăŤăżăźăŻăăźă¸ăŁăźăfalse
ăčżăčŚç´ ă§ăăăćĺşăăžăďź
ďźRFC2870ăŽlibăăźă ăŤăăăłăĄăłăăŤĺ°ăăŞčĄăăăăă¨ăŤć°ăĽăăžăăă
ĺŻč˝ć§ă¨ăăŚăŻăăĄă˝ăăăćąç¨ĺăăăă¨ăŤăăăĄă˝ăăăŽăăŞăźăăźăăźăăăăăŤăăźăăżăźăłăŞăŠăăăăžăă
䝼ĺăŽĺ ˇčąĄĺăăžă ĺăĺ Ľăăĺ ´ĺăăĄă˝ăăăă¸ă§ăăŞăăŻăŤăăăă¨ăŻä¸ä˝äşćć§ăăăăžăăďź ăăăăăŞăăç§ăŻăăăĺé˛ăăăăăŽćčŻăŽćšćłă§ăăă¨äżĄăăŚăăžăă
ďźă¤ăăŹăźăżăŽăĄă˝ăăăŻé常ăĺä˝ĺ¤ć´č
ă§ăŻăŞăă˘ăăăżă§ăăăăăăăŤăăźăăżăźăłăŻă¤ăăŹăźăżă§ăŻĺ°ăç´ćçă§ăŻăăăžăăăăăăŤăĺäžăŻăăăžăăăăă¨ăă°ă chunks
ă¨chunks_exact
ăŻ2ă¤ăŽĺĽĺăŽăĄă˝ăăă§ăă ă chunks().exact()
ăłăłăă§ăŻăăăžăăăďź
ăăăăĺć¨čŤă¨ăăŚç§ăçĽăŁăŚăăéăăçžĺ¨ăŽč¨č¨ă§ăŻăăăžăăă
䝼ĺăŻćŠč˝ăăŚăăžăăăăăżă¤ăăŽăăăžăăăŽăăăŤĺ¤ąćăăĺŻč˝ć§ăăăăžăă ăăăŠăŤăăŽéşäźĺŚ
é˘ć°ăŽĺăŻĺ˝šăŤçŤăĄăžăăăćŁăăĺŽčĄăăăŽăŻé常ăŤéŁăăă§ăă
2020ĺš´6ć12ćĽéććĽă21ďź21 [email protected]ăŻćŹĄăŽăăăŤć¸ăăŚăăžăă
ďźRFC2870ăŽlibăăźă ăŤăăăłăĄăłăăŽĺ°ăăŞčĄăŤć°ăĽăăžăă
https://github.com/rust-lang/rfcs/pull/2369 ďźĺŻč˝ć§ă¨ăăŚăŻăăĄă˝ăăăćąç¨ĺăăăă¨ă§ăĄă˝ăăăăăŞăźăăźăăźăăăăăă¨ăĺŤăžăăĺ ´ĺăăăăžăă
ăžăăŻăăŤăăźăăżăźăłăăăă§ăĺăĺ Ľăăĺ ´ĺăăĄă˝ăăăă¸ă§ăăŞăăŻăŤăăăă¨ăŻä¸ä˝äşćć§ăăăăžăăďź
䝼ĺăŽăłăłăŻăŞăźăăżă¤ăďź ăăăăăŞăăăăăćĺăŽćšćłă ă¨ćăăžă
ĺćšăďźăăŤăăźăăżăźăłăŻăă¤ăăŹăźăżă§ăŻĺ°ăç´ćçă§ăŻăăăžăăă
ă¤ăăŹăźăżăŻé常ăĺä˝ĺ¤ć´č ă§ăŻăŞăăă˘ăăăżă§ăă ăăŽä¸ăăăăžă
ăă¨ăă°ăchunksă¨chunks_exactăŻ2ă¤ăŽĺĽĺăŽăăŽă§ăă
ăăŁăłăŻďźďź.exactďźďźăłăłăă§ăŻăŞăăăĄă˝ăăăďźâ
ăăŞăăč¨ĺăăăăŽă§ăăăŞăăŻăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăGitHubă§čĄ¨ç¤şăăŚăă ăă
https://github.com/rust-lang/rust/issues/43244#issuecomment-643444213 ă
ăžăăŻčłźčŞă解é¤ăă
https://github.com/notifications/unsubscribe-auth/AB2HJELPWXNXJMX2ZDA6F63RWJ53FANCNFSM4DTDLGPA
ă
䝼ĺăŽĺ ˇčąĄĺăăžă ĺăĺ Ľăăĺ ´ĺăăĄă˝ăăăă¸ă§ăăŞăăŻăŤăăăă¨ăŻä¸ä˝äşćć§ăăăăžăăďź ăăăăăŞăăç§ăŻăăăĺé˛ăăăăăŽćčŻăŽćšćłă§ăăă¨äżĄăăŚăăžăă
ăăăăĺ ´ĺăŤăăŁăŚăŻĺć¨čŤăç ´ăăăăăă§ăă ăă¨ăă°foo.method(bar.into())
ăŻăĺ
ˇä˝çăŞĺăŽĺźć°ă§ăŻćŠč˝ăăžăăăă¸ă§ăăŞăăŻĺăŽĺźć°ă§ăŻćŠč˝ăăžăăă
çžĺ¨ĺŽčŁ ăăăŚăădrain_filterăŻé常ăŤäžżĺŠă ă¨ćăăžăă ăăŽăžăžĺŽĺŽăăăăă¨ăă§ăăžăăďź ĺ°ćĽăăăčŻăć˝čąĄĺăçşčŚăăăă¨ăăŚăăăăăăĺ°ĺ ĽăăăăŽă匨ăăăăŽăŻä˝ăăăăžăăă
drain_filter()
ă§ä˝ă辡ăăŁăŚăă retain_mut()
čż˝ĺ ăăăŤăŻăăŠăŽăăăŞăăăťăšăéĺ§ăăĺż
čŚăăăăžăăďź čŚäťśăŻç°ăŞăŁăŚăăăăăŤćăăă drain_filter()
ă§ä˝ă辡ăăŁăŚăă retain_mut()
ăŻăžă ćç¨ă§ăăă¨ćăăăžăă
@BartMasseyăŽć°ăăä¸ĺŽĺŽăŞăŠă¤ăăŠăŞAPIăŽĺ ´ĺăĺŽčŁ ă使ç¨ăăŚPRăä˝ćăăăă¨ăŻĺéĄăŞăă¨ćăăžăă ăăŽćŠč˝ăĺŽčŁ ăăăăăŽćé ăŻă httpsďź//rustc-dev-guide.rust-lang.org/implementing_new_features.htmlă¨https://rustc-dev-guide.rust-lang.org/getting-started.htmlăŤăăăžăăĺ¤ć´ăăăšăăăăăăŽďźbuilding-and-testing-
äťćĽăŻHashMap
ă¨BTreeMap
ăŽAPIăŽéăăŤčŚĺ´ăăŚăăžăăăăăăžăăžăŞăłăŹăŻăˇă§ăłăä¸č˛ŤăăAPIăçśćăăăăăŤĺŞĺăăăă¨ăéčŚă ă¨ćăăžăăăťăłăšăăăŽćçšă§ĺ¸¸ăŤăăă§ăăă¨ăŻéăăŞăä˝ăă
ăă¨ăă°ăStringăVecăHashMapăHashSetăBinaryHeapăVecDequeăŤăŻretain
ăĄă˝ăăăăăăžăăăLinkedListă¨BTreeMapăŤăŻăăăžăăă retain
ăŻăăŠăłăă ăŞĺé¤ăé常ăŤăłăšăăŽăăăćä˝ă§ăăăăŻăăŤăăăăLinkedListăžăăŻMapăŽćšăčŞçśăŞćšćłăŽăăăŤčŚăăăăăçšăŤĺĽĺŚă ă¨ćăăžăă
ăăăŚăăăĺ°ă桹ăćăä¸ăăă¨ăăăăŤč¤éăŤăŞăăžăă HashMap::retain
ăŽăŻăăźă¸ăŁăŤăŻĺŻĺ¤ĺç
§ăŽĺ¤ă渥ăăăžăăăäťăŽăłăŹăŻăˇă§ăłăŤăŻä¸ĺ¤ĺç
§ă渥ăăăžăďźStringăŻĺç´ăŞchar
ăĺĺžăăžăďźă ďźă
drain_filter
ăŽăăăŞć°ăăAPIăčż˝ĺ ăăă1 /ăretain
ă¨éč¤ăăŚăăăăăŤčŚăă2 /ăăăšăŚăŽăłăŹăŻăˇă§ăłă§ĺćăŤĺŽĺŽĺăăăŚăăŞăăă¨ăăăăăžăă
HashMap::drain_filter
ăŻă˘ăăăšăăŞăźă ăŞăă¸ăăŞăŤăăăžăăăRustăŽstd AFAIKăŤăŻăžă äťĺąăăŚăăžăăďźăăăĽăĄăłăăŤăŻčĄ¨ç¤şăăăžăăďźBTreeMap::drain_filter
ă Vec::drain_filter
ă LinkedList::drain_filter
ăŻRustăŽć¨ćşăŤăăăžăăăćŠč˝ăŻă˛ăźăăăăŚăăžăVecDeque::drain_filter
ăŻăžăŁăăĺĺ¨ăăŞăăăă§ăăăăĽăĄăłăăŤăŻčĄ¨ç¤şăăăžăăString::drain_filter
ăĺĺ¨ăăžăăăăăăŽćŠč˝ăĺŽčŁ
ăăăăăŽćčŻăŽćšćłăăžăăŻdrain_filter
ă retain
ăăžăăŻăăŽä¸Ąćšăĺż
čŚăŞĺ ´ĺăç§ăŻĺźˇăćčŚăćăŁăŚăăžăăăăăăăăŽAPIăŻăłăŹăŻăˇă§ăłéă§ä¸č˛Ťć§ăäżă¤ĺż
čŚăăăă¨ĺźˇă俥ăăŚăăžăă
ăăăŚăăăăăăŁă¨éčŚăŞăă¨ăŤăç°ăŞăăłăŹăŻăˇă§ăłăŽĺć§ăŽăĄă˝ăăăŻĺăăťăăłăăŁăŻăšăćă¤ĺż
čŚăăăăžăă retain
ăŽçžĺ¨ăŽĺŽčŁ
ăIMOăŤéĺăăŚăăăă¨ă
ćăĺčăŤăŞăăłăĄăłă
ăăăĺŽĺŽăăăŽă匨ăăăăŽăŻăăăžăăďź