/// 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 ๋ค์ด์ค๋ ์ค.
์๋ง๋ ์ด๊ฒ์ ๋ถ์ ์ฑํฌ๋๋ฅผ ํฌํจํ ํ์๊ฐ ์์ง๋ง ๋ฒ์ ๋งค๊ฐ๋ณ์๋ฅผ _ํ ์_ ์์ผ๋ฏ๋ก ๋ฐฐ์๊ด์ ์์ ์งํฉ๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํ ๋จ์ ์ด ์์ต๋๊น? ๋ฒ์๋ฅผ ํ์ธํ๋ ๊ฒฝ๊ณ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๋จ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋นํฉํ ์ ์๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ 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
์ ์กฐ๊ฑด๋ถ ๋ฒ์ ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด letters.remove_if(3, |n| n < 10);
๋ <10์ธ ๊ฒฝ์ฐ ์ธ๋ฑ์ค 3์ ๋ฌธ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค. .
๋ฐ๋ฉด์ drain_filter
๋ ์ฝ๊ฐ ๋ชจํธํฉ๋๋ค. drain
๋ค์ filter
๋ฅผ ๋ ์ต์ ํ๋ ๋ฐฉ์์ผ๋ก(์: filter_map) ๋๋ ๋ฐ๋ณต์๊ฐ ๋ค์๊ณผ ๋น๊ตํ ์ ์๋๋ก ๋ฐํ๋๋๋ก ๋ฐฐ์ํฉ๋๋ค. ๋ฐ๋ณต์ filter
๋ ๋ฐํํ ๊ฒ์ด๊ณ ,
ํํฐ๊ฐ ์ด์ ์ ๋
ผ๋ฆฌ์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ filtered_drain
๋ผ๊ณ ํด์๋ ์ ๋ฉ๋๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋์์๋ _where
๋๋ _if
๋ฅผ ์ฌ์ฉํ ์ ๋ก๋ ์์ต๋๋ค.
์ฃผ์์ "๋๋ฑํ" ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค... "์ฌ๊ธฐ์ ์๋ ์ฝ๋" ์ฌ์ดํธ์์ 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
์ ๊ตฌ์ฑ์์
๋๋ค.
Drain์ ์ปจํ ์ด๋์๋ง ์ ์ฉ๋๋ Rust์ ๋ค ๋ฒ์งธ ์์ ๊ถ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ฉ์ด์ ๋๋ค. ๋ํ ์ผ๋ฐ์ ์ผ๋ก ๊ฑฐ์ ๋ชจ๋ ๋ค๋ฅธ ์ธ์ด์์๋ ์๋ฏธ๊ฐ ์์ต๋๋ค(์ด๋ ์๋ฏธ ์ฒด๊ณ๊ฐ ์์ผ๋ฉด ๋จ์ผ ""์์"" ์์ ).
drain_filter๋ ๋ฐฐ์ ์ฉ์ด๋ฅผ ๋ค๋ฅธ ์ธ์ด๊ฐ ์ ๊ฒฝ ์ธ ๊ณต๊ฐ์ผ๋ก ์ด๋ํ์ง๋ง(๋ฐฑ์ํํธ๋ฅผ ํผํ๋ ๊ฒ์ ๋ชจ๋ ์ธ์ด์์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์).
$ rust consume vec
์ ๋ํ Google ๊ฒฐ๊ณผ๋ก ๋ฌธ์์์ drain_filter
์(๋ฅผ) ๋ฐ๊ฒฌํ์ต๋๋ค. ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋
น์ ๋ถ๋ณ์ฑ์ผ๋ก ์ธํด ํํฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋นํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ ๊ด๋ฆฌํ ์ ์๋๋ก ์ ๊ทผ ๋ฐฉ๋ฒ์ ๊ธฐ์ตํ ์ ์์์ต๋๋ค.
drain_where
๋ ์ข์ง๋ง ์ฌ์ฉ์๊ฐ drain
๋ฐ filter
๊ฐ ๋ฌด์์ ํ๋์ง ์๊ณ ์๋ ํ ์ด ๋ฉ์๋๊ฐ ์ ์ด ํํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋ ์ธํ๋ ๊ฒ์ด ๋ถ๋ช
ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ฌ์ ํ drain_filter
๊ฐ ๋ฐฐ์(์ฆ, ๋น์)ํ ๋ค์ ํํฐ๋งํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ฒ๋ผ ๋๋๋๋ค. ๋ฐ๋ฉด์ drain_where
๋ ์ฃผ์ด์ง ์กฐ๊ฑด์ด ์ ์ง๋๋ ์์๋ฅผ ๋ฐฐ์ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค(์ ์๋ ๊ธฐ๋ฅ์ด ์ํํ๋ ์์
).
์ ์ด์ ์ผ์นํ๋ ๋๋จธ์ง ์์๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด linked_list::DrainFilter
๋ Drop
$๋ฅผ ๊ตฌํํด์ผ ํ์ง ์์ต๋๊น?
๋ค
๋ฐ๋ณต์๋ฅผ ์ญ์ ํ๋ฉด ์ ๋ฐ๋ณต์๊ฐ ๋๊น์ง ์คํ๋ฉ๋๊น? iterator์ ๋ํ ๋๋ผ์ด ๋์์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ์ํ๋ ๊ฒฝ์ฐ ๋ช
์์ ์ผ๋ก ์ํํ ์๋ ์์ต๋๋ค. ๋ฐ๋ฉด์ ๋ฐ๋ณต์๋ฅผ mem::forget
ํ๋ฉด ๋์ถ ์ฆํญ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ํ์ํ ๋งํผ๋ง ์์๋ฅผ ์ ๊ฑฐํ๋ ์ญ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ ๋ ์ด ๊ธฐ๋ฅ์ ๋ง์ด ์ฌ์ฉํด ์์ผ๋ฉฐ ํญ์ ๋ฐฐ์ํ๋ ค๋ ํญ๋ชฉ์ ๋ํด true
๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ์ด๋ retain()
/ retain_mut()
์ ๋นํด ์ง๊ด์ ์ด์ง ์์ต๋๋ค.
์ง๊ด์ ์ธ ๋
ผ๋ฆฌ์ ์์ค์์ ๋ด๊ฐ ์ ์งํ๊ณ ์ถ์ ํญ๋ชฉ์ ๋ํด true
๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ผ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ ์ด๋ฐ ์๊ฐ์ ํฉ๋๊น? (ํนํ retain()
๊ฐ ์ด๋ฏธ ์ด๋ฐ ์์ผ๋ก ์๋ํ๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด)
๊ทธ๋ ๊ฒ ํ์ง ์๊ณ drain_filter()
์ ์ด๋ฆ์ retain_iter()
๋๋ retain_drain()
(๋๋ drain_retain()
)๋ก ๋ฐ๊พธ์ญ์์ค.
๊ทธ๋ฌ๋ฉด retain()
๋ ๋ ๊ฐ๊น๊ฒ ๋ฏธ๋ฌ๋ง๋ฉ๋๋ค!
์ด๊ฒ์ด ๋ด๊ฐ ์ด๋ฆ์ ๋ค์์ผ๋ก ๋ฐ๊พธ์๊ณ ์ ์ํ ์ด์ ์
๋๋ค
drain_where
๋ค์๊ณผ ๊ฐ์ด ๋ช
ํํฉ๋๋ค.
๋ฐฐ์๊ตฌ์ ํ ํํ์ด๋ฏ๋ก ์ด๋ฆ์ ๋ฐฐ์๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
where
๋ฅผ drain
์ ํจ๊ป ์ฌ์ฉํ๋ฉด
์์ _where_ ์ ์ด๊ฐ true์ด๋ฉด ๋ฐฐ์๋ฉ๋๋ค. ์ฆ, ์ ๊ฑฐ๋๊ณ ๋ฐํ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์์ด ์๋ ๊ฒฝ์ฐ std์ ๋ค๋ฅธ ์ด๋ฆ๊ณผ ๋ ๋๊ธฐํ๋ฉ๋๋ค.
๋ ๊ฐ์ ์ ์ด๋ก ๊ตฌ์ฑ๋ ํจ์๋ ๋ค์์ ์ฌ์ฉํ์ฌ (๋๋ต) ์๋ฎฌ๋ ์ดํธํ ์ ์์ต๋๋ค.
"and then" ๋ฐฉ์์ผ๋ก ๊ฐ ์ ์ด๋ฅผ ๋ํ๋ด๋ ํจ์, ์
filter_map
๋ (๋๋ต) filter an then map
๋ก ์๋ฎฌ๋ ์ดํธ๋ ์ ์์ต๋๋ค. ํ์ฌ
name ์ drain and then filter
์์ ๋ํ๋ด์ง๋ง ๊ทธ ๊ทผ์ฒ์๋ ์์ต๋๋ค.
์์ ํ ๋ฐฐ์๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
2018๋ 2์ 25์ผ ์ผ์์ผ 17:04 Boscop [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋๋ ์ด ๊ธฐ๋ฅ์ ๋ง์ด ์ฌ์ฉํด์๊ณ ํญ์ ๊ธฐ์ตํด์ผ ํ๋ค.
๋ด๊ฐ ๋ฐฐ์ํ๋ ค๋ ํญ๋ชฉ์ ๋ํด true๋ฅผ ๋ฐํํฉ๋๋ค.
Retain_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
.
๋ณ๊ฒฝ๋์ง๋ ์์ง๋ง true๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ ๊ฒ์
๋น์ ์ ๊ทธ๋ ๊ฒํด์ผํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ใ
. drain_where
๋น. retain_where
์จ. retain
๋๋ drain_retain
๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์
๋๋ค.
๋ฐฐ์ ๋ฐ ์ ์ง๋ ๊ฐ์ ์ข
๋ฅ์ ํ๋ก์ธ์ค์ ๋ํด ์ด์ผ๊ธฐํ์ง๋ง ๋ฐ๋์
๋๋ค.
๊ด์ , ๋ฐฐ์๋ ๋น์ ์ด ์ ๊ฑฐ(๋ฐ r ๋ฐํ) ์ ์ง์ ๋ํด ๋งํฉ๋๋ค.
๋น์ ์ด ์ ์งํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํฉ๋๋ค (์ด๋ฏธ std์์ ์ฌ์ฉ๋๋ ๋ฐฉ์์ผ๋ก).
ํ์ฌ retaim
๋ ์ด๋ฏธ std๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ ์ฃผ์ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
drain
๊ฐ ์์๋ฅผ ๋ฐํํ๋ ๋์ ์์๋ฅผ ๋ฒ๋ฆฌ๋ฏ๋ก
retain
(์ฌํ๊ฒ๋) ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ์ ๋ถ์ ํฉํฉ๋๋ค(์ ํ๋ฅผ ํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ธ
retain_and_return
๋๋ ์ด์ ์ ์ฌํ ๊ฒ).
๋ฐฐ์์ ๋ํด ๋งํ๋ ๋ ๋ค๋ฅธ ์์ ์ ๋ง์ด๊ทธ๋ ์ด์
์ ์ฉ์ด์ฑ์
๋๋ค.
drain_where
๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋จ์ด ๊ธฐ๋ฐ ๊ฒ์์ ์คํํ๋ ๊ฒ๋งํผ ์ฝ์ต๋๋ค.
์ฝ๋๋ฅผ ์ ์งํ๋๋ก ๋ณ๊ฒฝํ๋ ๋์ ์ถ๊ฐ ๋ถ์ ์ด ํ์ํฉ๋๋ค.
์ฌ์ฉ๋ ๋ชจ๋ ์ ์ด/ํํฐ ๊ธฐ๋ฅ.
2018๋ 2์ 25์ผ ์ผ์์ผ 18:01 Boscop [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ทธ๋ฌ๋ drain_where()๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ก์ ๊ฐ ์ฌ์ ํ true๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
์ ๊ฑฐํด์ผ ํ๋ ์์, ์ด๋ ์ ์ง()์ ๋ฐ๋์ ๋๋ค.
๋ชจ์๋๊ฒ ๋ง๋ ๋ค..
์๋ง๋ keep_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_retain()
๋ drain()
๋ฉ์๋๊ฐ ๋ฒ์์ ๋ชจ๋ ์์๋ฅผ โโ๋ฌด์กฐ๊ฑด ๋ฐฐ์ถํ๋ ๋ฐ๋ฉด drain_retain()
๋ ํด๋ก์ ๊ฐ true
๋ฅผ ๋ฐํํ๋ ์์๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. drain()
๋ฐ retain()
๋ฐฉ๋ฒ์ ํจ๊ณผ.
์ฃ์กํฉ๋๋ค drain_filter
์์ drain_where
๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ค๊ณ ํฉ๋๋ค.
retain
๋ฅผ ์ฌ์ฉํ๋ ์๋ฃจ์
์ด ์๊ณ ๋ค์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
drain_filter
๋ ์์ง ๊ณ ๋ คํ์ง ์์ ์ธก๋ฉด์
๋๋ค.
2018๋ 2์ 25์ผ ์ผ์์ผ 19:12 Boscop [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
ํ์ง๋ง ์ drain()์์ drain_filter()๋ก ๋ง์ด๊ทธ๋ ์ด์ ํฉ๋๊น?
์ง๊ธ๊น์ง์ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋๋ ์ ์ง()์์ ๋ฐฐ์ ํํฐ()๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค.
std์๋ ์ ์ง_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()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์). ๋ฐฐ์๋ ๊ฐ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ฏธ๋์ ๋ค๋ฅธ ์ฌ๋๋ค &mut
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ drain_filter()
๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค retain()
, ๋๋ฌด, ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์๋ ๊ฐ์ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒ๋ณด๋ค ๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค.
๋ด๊ฐ drain_retain
์ ๋ฐ๋ํ๋ ์ด์ ๋ ํ์ฌ std wrt์์ ์ด๋ฆ์ด ์ฌ์ฉ๋๋ ๋ฐฉ์ ๋๋ฌธ์
๋๋ค. ์ปฌ๋ ์
:
drain
, collect
, fold
, all
, take
, ...*_where
, *_while
์ ๊ฐ์ ์์ ์๊ฐ ์์ต๋๋ค.map
, filter
, skip
, ...)map
๋ filter
/ skip
).filter_map
apply modifier_1 and then apply modifier_2
์ ๊ฐ๋
์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ ๋ฒ์ ์ด ์์
์ ์ํํ๋ ๊ฒ์ด ๋ ๋น ๋ฅด๊ณ ์ ์ฐํฉ๋๋ค.๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
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
๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ถ์ธกํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ํํธ์ผ๋ก๋ modify
+ retain
๋ฅผ ๊ฒฐํฉํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก retain_mut
๋ฅผ ์๊ฐํ๋ ๋น ๋ฅธ RFC๋ฅผ ์ฌ๋ retain_mut
๊ฐ ์์ด์ผ ํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. retain
๋ ๋น ๋ฅผ ์๋ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์์ ํ๋์์ต๋๋ค. ๊ทธ๋๊น์ง๋ ๋ค์์ ์ ๊ณตํ๋ ํ์ฅ ํน์ฑ์ ์์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
iter_mut
+ bool-array(๋๋ bitarray ๋๋...)๋ฅผ ์ฌ์ฉํ์ฌ $ retain_mut
๋ฅผ ์์ ํ์ฌ ์ด๋ค ์์๋ฅผ ์ถ์ ํ๋์ง
์ ๊ฑฐํด์ผ ํฉ๋๋ค. ๋๋ ๋ด๋ถ์ ์ผ๋ก drain_filer
/ drain_where
๋ฅผ ์ฌ์ฉํ๋ ์์ฒด drain_retain
$ ์ ๊ณต
๊ทธ๋ฌ๋ ์ ์ด๋ฅผ not |ele| !predicate(ele)
๋ก ๋ํํฉ๋๋ค.
@dathinab
*_where
๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ด๋ค ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๊น?retain()
, drain()
์ ๊ฐ์ด ์ปฌ๋ ์
์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฉ์๋์ ๋ช
๋ช
์ฒด๊ณ๋ฅผ ๋น๊ตํด์ผ ํฉ๋๋ค. ํ๋์ ๋ฐ๋ณต์๋ฅผ ๋ค๋ฅธ ๋ฐ๋ณต์๋ก ๋ณํํ๋ Iterator ๋ฉ์๋์๋ ํผ๋์ด ์์ต๋๋ค.drain_filter()
retain_mut()
๊ฐ std์ ์ถ๊ฐ๋์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ด์์ต๋๋ค. retain()
์์ drain_filter()
๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ์ฌ์ฉ ์ฌ๋ก๋ ๋งค์ฐ ์ผ๋ฐ์ ์ด๋ฏ๋ก ์ ์ฌํ ์ด๋ฆ๊ณผ API๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค( true
๋ฅผ ๋ฐํํ๋ ํด๋ก์ ๋ ํญ๋ชฉ์ ์ ์งํ๋ค๋ ์๋ฏธ์
๋๋ค. )..retain_mut
์ด(๊ฐ) ์ด๋ฏธ ๋
ผ์๋์๋ค๋ ์ฌ์ค์ ๋ชฐ๋์ต๋๋ค.
์ฐ๋ฆฌ๋ std์ ์ผ๋ฐ์ ์ธ ๋ช
๋ช
์ฒด๊ณ์ ๋ํด ์ฃผ๋ก wrt์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์๊ฒ
Iterators๋ ์ฃผ์ ์ปฌ๋ ์
์ค ํ๋์ด๋ฏ๋ก Iterator๋ฅผ ํฌํจํฉ๋๋ค.
๋
น์ ์๋ ์ปฌ๋ ์
์ ๋ํ ์ก์ธ์ค ๋ฐฉ๋ฒ, ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ
๋ ์ด์์ ํญ๋ชฉ์ ์์ ํฉ๋๋ค.
_where
๋ ์ฝ๊ฐ ์์ ๋ ๊ฒ์ ํํํ๊ธฐ ์ํ ์ ๋ฏธ์ฌ์ ์์ผ ๋ฟ์
๋๋ค._until
, _while
, _then
, _else
, _mut
๋ฐ _back
.drain_retain
์ด ํผ๋์ค๋ฌ์ด ์ด์ ๋ ๊ทธ๊ฒ์ด ๋ง๋์ง ๋ช
ํํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฐฐ์ ๋๋ ์ ์ง ๊ธฐ๋ฐ, ๋ฐฐ์ ๊ธฐ๋ฐ์ธ ๊ฒฝ์ฐ true๋ฅผ ๋ฐํํ๋ฉด ์ ๊ฑฐ๋ฉ๋๋ค.
๊ฐ์ด ์ ์ง ๊ธฐ๋ฐ์ธ ๊ฒฝ์ฐ ์ ์งํฉ๋๋ค. _where
๋ฅผ ์ฌ์ฉํ๋ฉด
๋ง์ง๋ง์ผ๋ก ์ ๋ฌ๋ ํจ์์ ๋ํด ์์๋๋ ๋ด์ฉ์ ์ง์๋๋ค.
2018๋ 2์ 26์ผ ์์์ผ 00:25 Boscop [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@dathinab https://github.com/dathinab
- ์ฌ๊ธฐ์๋ Iterator๊ฐ ์๋ ์ปฌ๋ ์ ์ ๋ํ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
map, filter, filter_map, skip, take_while ๋ฑ์ ๋ชจ๋ Iterator์ ๋ฉ์๋์ ๋๋ค.
Btw, *_where๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ด๋ค ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๊น?
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ช ๋ช ์ฒด๊ณ๋ฅผ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฉ์๋์ ๋น๊ตํด์ผ ํฉ๋๋ค.
์ปฌ๋ ์ ์ ๋ํด, ์๋ฅผ ๋ค์ด ์ ์ง(), ๋ฐฐ์(). ์ ํผ๋์ด ์๋ค.
๋ฐ๋ณต์๋ฅผ ๋ค๋ฅธ ๋ฐ๋ณต์๋ก ๋ณํํ๋ ๋ฐ๋ณต์ ๋ฉ์๋.- AFAIK ํฉ์๋ stay_mut()์ด std์ ์ถ๊ฐ๋์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ด์์ต๋๋ค.
drain_filter()๊ฐ ์ด๋ฏธ ์ถ๊ฐ๋๊ณ ์ฌ๋๋ค์ด ์กฐ์ธ์ ๋ฐ์๊ธฐ ๋๋ฌธ์
๊ทธ๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ๋ค์์์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฌ์ฉ ์ฌ๋ก๋ก ๋์๊ฐ
Retain() to 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_mut()์ ๋นํด ์ง๊ด์ ์ด์ง ์์ต๋๋ค.
FWIW, ์ฌ๊ธฐ์ retain
๋ ์ง๊ด์ ์ด์ง ์์ ์ด๋ฆ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ณดํต ๋ฒกํฐ์์ ํน์ ์์๋ฅผ ์ญ์ ํ๊ณ ์ถ์ดํ๋ฉฐ retain
๋ฅผ ์ฌ์ฉํ์ฌ ํญ์ ํด๋น ๋
ผ๋ฆฌ๋ฅผ ๋ฐ์ ์์ผ์ผ ํฉ๋๋ค.
๊ทผ๋ฐ retain()
๋ ์ด๋ฏธ ์คํ
์ด๋ธ์ด ์์ด์ ๊ฐ์ด ์ด์์ผ์ง.. ๊ทธ๋์ ๋ด ์ง๊ฐ์ด ์ต์ํด์ก์ด..
@Boscop : retain
drain
๋ ๋ง์ฐฌ๊ฐ์ง์ง๋ง ์ ๊ฑฐ๋ ์์์ _until
, _while
์ ๊ฐ์ ์ ๋ฏธ์ฌ ์ฌ์ฉ์ ๋ฐํํฉ๋๋ค. ๊ธฐ์กด ๊ธฐ๋ฅ์ ์ฝ๊ฐ ์์ ๋ ๋ฒ์ ์ธ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ.
๋ฐฐ์๋ฅผ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
_"์ด๋ค ๋ฐฉ์์ผ๋ก๋ " ์ง์ ๋ ๋ชจ๋ ์์๋ฅผ โโ์ ๊ฑฐํ๊ณ ๋ฐํํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ์์๋ ์ ์ง_
์ฌ๊ธฐ์ _"์ด๋ค ์์ผ๋ก๋ "_์ ์ฌ๋ผ์ด์ค ๊ฐ๋ฅํ ๋ชจ๋ ์ปฌ๋ ์
์ ํ์ ๋ํด _"์ฌ๋ผ์ด์ฑ์ ์ํ"_์ด๊ณ ๋๋จธ์ง ์ ํ์ ๋ํด์๋ _"๋ชจ๋"_์
๋๋ค.
์ฌ๊ธฐ์ ๋
ผ์๋ ๊ธฐ๋ฅ์ ๋ํ ์ค๋ช
์ ๋ค์์ ์ ์ธํ๊ณ ๋ _๋์ผํฉ๋๋ค_
_"์ด๋ค ์์ผ๋ก๋ "_๋ _"์ด๋ฉฐ, ์ฌ๊ธฐ์ ์ฃผ์ด์ง ์ ์ด๋ true๋ฅผ ๋ฐํํฉ๋๋ค."_.
๋ค๋ฅธ ํํธ์ผ๋ก๋ ๋ด๊ฐ ์ ์งํ๊ณ ์ ํ๋ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
_์ฃผ์ด์ง ์ ์ด๊ฐ true๋ฅผ ๋ฐํํ๋ ์์๋ง ์ ์ง(์ฆ ์ ์ง)ํ๊ณ ๋๋จธ์ง๋ ๋ฒ๋ฆฝ๋๋ค_
(์, ์ ์ง๋ ๋๋จธ์ง๋ฅผ ๋ฒ๋ฆฌ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ์์์ง๋ง ์ฌํ๊ฒ๋ ๊ทธ๋ ์ง ์์์ต๋๋ค)
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
๋ฅผ ์ข์ํ๋ค.)@Gankro , ์ด๋ป๊ฒ ์๊ฐํด?
libs ํ์ ์ด์ ๋ํด ๋
ผ์ํ์ผ๋ฉฐ ํ์ฌ๋ก์๋ drain
๊ฐ์ ๋ฉ์๋๋ฅผ ๋ ์ด์ ์์ ํ ํ์ง ์๋ ๊ฒ์ด ํฉ์์์ต๋๋ค. (๊ธฐ์กด์ drain_filter
๋ฉ์๋๋ Nightly์์ ๋ถ์์ ํ ์ํ๋ก ๋จ์ ์ ์์ต๋๋ค.) https://github.com/rust-lang/rfcs/pull/2369 ๋ ๋๋กญ๋ ๋ ์๋ฌด ๊ฒ๋ ํ์ง ์๋ ๋ ๋ค๋ฅธ ๋ฐฐ์ ๊ฐ์ ๋ฐ๋ณต์๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค. (๋ฐ๋ณต์๋ฅผ ๋๊น์ง ์๋นํ๋ ๊ฒ๊ณผ ๋ฐ๋).
๋ค์ํ ๋ฐฐ์ ์กฐํฉ ์กฐํฉ์ ๋ ์์ API ํ๋ฉด์ผ๋ก ์ผ๋ฐํํ๋ ค๋ ์คํ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
RangeArgument
aka RangeBounds
) ๋ ์ ์ฒด ์ปฌ๋ ์
(ํ์๋ ..
, RangeFull
์ ํ์ ๊ฐ์ ์ ๋ฌํ์ฌ ๋ฌ์ฑํ ์ ์์) ).๊ฐ๋ฅ์ฑ์๋ ๋ฉ์๋๋ฅผ ์ผ๋ฐํํ๊ฑฐ๋ ๋น๋ ํจํด์ "์ค๋ฒ๋ก๋"ํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
ํ ๊ฐ์ง ์ ์ฝ ์กฐ๊ฑด์ drain
๋ฉ์๋๊ฐ ์์ ์ ์ด๋ผ๋ ๊ฒ์
๋๋ค. ์ผ๋ฐํํ ์๋ ์์ง๋ง ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ์์ผ๋ก๋ง ๊ฐ๋ฅํฉ๋๋ค.
๋ค์ํ ๋ฐฐ์ ์กฐํฉ ์กฐํฉ์ ๋ ์์ API ํ๋ฉด์ผ๋ก ์ผ๋ฐํํ๋ ค๋ ์คํ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
ํ์ ์ด๋ฌํ ์ ํ์ ์คํ์ด ๋ฐ์ํ๋ ๋ฐฉ๋ฒ๊ณผ ์์น๋ฅผ ์์ธกํฉ๋๊น?
๋ฐฉ๋ฒ: ๊ฐ๋
์ฆ๋ช
๊ตฌํ(์ ์ด๋ Vec::as_mut_ptr
๋ฐ Vec::set_len
ํตํด ํธ๋ฆฌ ์ธ๋ถ์์ ์ํ ๊ฐ๋ฅ)์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฒด์ ์ธ API ์ค๊ณ๋ฅผ ์ ์ํ๊ณ ์ ์ํฉ๋๋ค. ์ฅ์๋ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค. https://internals.rust-lang.org/c/libs ์ ์ RFC ๋๋ ์ค๋ ๋์ผ ์ ์์ผ๋ฉฐ ์ฌ๊ธฐ์์ ๋งํฌํฉ๋๋ค.
๋๋ ์ด๊ฒ์ผ๋ก ์ ์ ๋๊ณ ์์๋ค. ๋ค์ ๋ ๋ด๋ถ์ ๋ํ ์ค๋ ๋๋ฅผ ์ด๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์๋ํ๋ ์ผ๋ฐ 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
๋ ์ด๋ฏธ ์์ ํ ๋์ด ์์ด์ ์ด๋ฆ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค..
๊ทธ๋ฐ ๋ค์ ๋ ๋ฒ์งธ๋ก ์ข์ ์ ์ฒด ์ต์
์ ํ์ฌ drain
๋ฅผ ์ ์งํ๊ณ .drain(..).filter()
์ ํผ๋์ ํผํ๊ธฐ ์ํด drain_filter
์ ์ด๋ฆ์ drain_where
๋ก ๋ฐ๊พธ๋ ๊ฒ์
๋๋ค.
(์์ joonhoo๊ฐ ๋งํ๋ฏ์ด : )
์ด ๋๋ ์ธ_ํํฐ์ ์ด๋ฆ์ drain_where๊ฐ ์๋ ์ด์ ๊ฐ ๋ฌด์์ ๋๊น? ๋์๊ฒ ์ ์๋ ์ ์ฒด Vec์ด ๋ฐฐ์๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํ์ง๋ง ๊ฒฐ๊ณผ์ ๋ํด ํํฐ๋ ์คํํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ?"). ๋ฐ๋ฉด์ ์ ์๋ ์ด๋ค ์กฐ๊ฑด์ด ์ ์ง๋๋ ๊ฒฝ์ฐ์๋ง ์์๋ฅผ ๋ฐฐ์ถํ๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
๋๋ ๋ด๋ถ์ ์ค๋ ๋๋ฅผ ์ด์์ต๋๋ค.
TLDR์ non-self-exhaustion์ด ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์์๋ณด๋ค ๋ ํฐ ์ ์บ์ด๋ผ๊ณ ์๊ฐํ๊ณ RangeBounds
๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ค์๋ณด๋ค ๋นจ๋ฆฌ drain_filter
๋ฅผ ์์ ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๊ตฐ๊ฐ ๊ฑฐ๊ธฐ์ ์ค๋ช
๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ข์ ์์ด๋์ด๊ฐ ์๋ ํ.
ํธ์ง: ์คํ ์ฝ๋๋ฅผ ์
๋ก๋ํ์ต๋๋ค: ๋ฐฐ์ ์คํ
๋ฐฐ์ ๋ฐ ์ฒญ์ ๋ฒค์น์ ์ผ๋ถ ํ
์คํธ๋ ์์ง๋ง ๊นจ๋ํ ์ฝ๋๋ฅผ ๊ธฐ๋ํ์ง๋ ์์ต๋๋ค.
์ด ์ค๋ ๋์์ ์์ ํ ๋น ์ก์ต๋๋ค. ์ด ์ค๋ ๋์์ ์ค๋ช
ํ๋ ๋ช ๊ฐ์ง ์ต์
์ ๋ฐ์ํ๊ธฐ ์ํด ์ฝ๊ฐ ์์ ํ๊ณ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ ์ค๋๋ impl์ด ์์ต๋๋ค. ๋
ผ์์ ์ฌ์ง๊ฐ ์๋ค๊ณ ์๊ฐํ๋ impl์ ๋ํ ํ ๊ฐ์ง ์ข์ ์ ์ DoubleEndedIterator
๋ฅผ ๊ตฌํํ๋ค๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์์ ๋ณด์ญ์์ค .
@Emerentius ํ์ง๋ง ์์๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ํด๋ก์ ๊ฐ true
๋ฅผ ๋ฐํํด์ผ ํจ์ ๋ํ๋ด๊ธฐ ์ํด ์ต์ํ drain_filter
์ ์ด๋ฆ์ drain_where
๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค!
@Boscop ๋ ๋ค true
=> yield์ ๋์ผํ '๊ทน์ฑ'์ ์๋ฏธํฉ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ์ด drain_filter
๋๋ drain_where
์ธ์ง ์๊ดํ์ง ์์ต๋๋ค.
@Popog ์ฐจ์ด์ ๊ณผ ์ฅ๋จ์ ์ ์์ฝํ ์ ์์ต๋๊น? ์ด์์ ์ผ๋ก๋ ๋ด๋ถ ์ค๋ ๋์์ ๋๋ฉ๋๋ค. DoubleEndedIterator
๊ธฐ๋ฅ์ 0 ๋๋ ๋ฎ์ ์ค๋ฒํค๋์ ํธํ ๊ฐ๋ฅํ๊ฒ ์ถ๊ฐ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค(๊ทธ๋ฌ๋ ํ
์คํธํ์ง๋ ์์์ต๋๋ค).
drain_or_retain
๋ ์ด๋ป์ต๋๊น? ์ด๊ฒ์ ๋ฌธ๋ฒ์ ์ผ๋ก ์๋ฏธ ์๋ ํ๋์ด๋ฉฐ ํ๋ ๋๋ ๋ค๋ฅธ ํ๋๋ฅผ ์ํํ๋ค๋ ์ ํธ์
๋๋ค.
@askeksa ๊ทธ๋ฌ๋ ํด๋ก์ ์์ true
๋ฅผ ๋ฐํํ๋ ๊ฒ์ด "๋๋ ์ธ" ๋๋ "๋ณด์ "๋ฅผ ์๋ฏธํ๋์ง ๋ช
ํํ์ง ์์ต๋๋ค.
drain_where
์ ๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด true
๋ฅผ ๋ฐํํ๋ฉด ๋น์์ง๋ ๊ฒ์ด ๋งค์ฐ ๋ถ๋ช
ํ๋ฉฐ ๋น์์ง์ง ์์ ์์๋ ์ ์ง๋๋ค๋ ๊ฒ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ๋ถ๋ช
ํด์ผ ํฉ๋๋ค.
๋ฐฐ์๋ฅผ ์ ํ/์ค์ง/์ทจ์/์ค๋จํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์ฒ์ N๊ฐ์ ์ง์๋ฅผ ๋นผ๋ด๊ณ ์ถ๋ค๋ฉด vec.drain_filter(|x| *x % 2 == 0).take(N).collect()
(๋๋ ๊ทธ ๋ณํ)์ ์ํํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
ํ์ฌ ๊ตฌํ๋์ด ์์ผ๋ฏ๋ก DrainFilter
์ drop
๋ฉ์๋๋ ํญ์ ์๋ฃ๋ ๋๊น์ง ๋ฐฐ์๋ฅผ ์คํํฉ๋๋ค. ๊ทธ๊ฒ์ ์ค๋จ๋ ์ ์์ต๋๋ค(์ ์ด๋ ๋๋ ๊ทธ๋ ๊ฒ ํ ์ ์๋ ์ด๋ค ํธ๋ฆญ๋ ์์๋ด์ง ๋ชปํ์ต๋๋ค).
ํด๋น ๋์์ ์ํ๋ฉด ๋ณธ ํ์๋ฅผ ์ถ์ ํ๋ ์ผ๋ถ ์ํ๋ฅผ ๋ซ๊ณ false๋ฅผ ๋ฐํํ๊ธฐ ์์ํด์ผ ํฉ๋๋ค. ์ด๋ํฐ๊ฐ ํฉ๋ฆฌ์ ์ผ๋ก ์๋ํ๋๋ก ํ๋ ค๋ฉด ๋๋กญ ์ ์๋ฃ๊น์ง ์คํํด์ผ ํฉ๋๋ค.
drain_filter
๊ฐ ํ์ฌ ๊ตฌํ๋์ด ์๋ ๋ฐฉ์์ด ์์ ํ์ง ์์ง๋ง
์ค์ ๋ก ์์ ์ํ wrt. ๊ธด์ฅ์ ํ๊ณ ์์ ์ ์ฌ๊ฐํ์ญ์์ค. ๋ํ ์ฝ๊ฒ ์ค๋จ์ ์ ๋ฐํฉ๋๋ค.
๊ทธ ์ค 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()
์ ๊ฐ์ ๋ฉ์๋๋ฅผ iterator์ ์ถ๊ฐํ๋ ๋ถ์์ฉ์ด ์์ต๋๋ค(๋๋ drain()
ํ์ง๋ง ์ด๊ฒ์
์์ ํ ๋ค๋ฅธ ํ ๋ก ์
๋๋ค)
๋ค๋ฅธ ์ฌ๋๋ค??
์๋ ์ถ๋ก ์ ์ฐพ์ ์ ์์ง๋ง ์๋ฃ๊น์ง ์คํ๋์ง ์๋ DrainFilter
์ ํจ๊ป ์๋ํ๋ ์ด๋ํฐ์ ์ฝ๊ฐ์ ๋ฌธ์ ๋ ์์๋ ๊ฒ์ผ๋ก ๊ธฐ์ตํฉ๋๋ค.
https://github.com/rust-lang/rust/issues/43244#issuecomment -394405057๋ ์ฐธ์กฐํ์ญ์์ค.
์ข์ ์ , ์๋ฅผ ๋ค์ด find
๋ ์ฒซ ๋ฒ์งธ ํํธ๊ฐ ๋ ๋๊น์ง ๋ฐฐ์๊ฐ ๋ฐฐ์๋๋๋ก ํฉ๋๋ค.
์ผ์น, ์ ์ฌํ all
, any
๋จ๋ฝ์ ์ํํ๋ฏ๋ก ์๋นํ ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค.
์ํธ. ๋ฌผ์ ๋นผ๋ค.
ํ , ์๊ฐ์ ๋ฐ๊ฟ์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
iterator์ ๋ถ์์ฉ์ด ์๊ณ ์ผ๋ฐ์ ์ธ ์๋ฃจ์
์ ๊ณ ๋ คํด์ผ ํ ์๋ ์์ต๋๋ค.
(์ด ์ถ์ ๋ฌธ์ ์ ๋ฌด๊ด) .allways_complete()
์ด๋ํฐ์ ๊ฐ์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ฐฐ์๊ตฌ๊ฐ ์๋ฃ๋ ๋๊น์ง ์คํํด์ผ ํ๋ ์์ ์์ ์ด์ ๋ฅผ ์ฐพ์ง ๋ชปํ์ง๋ง ์ฌ๊ธฐ ์ ์์ ๋ช ๊ฐ์ง ๊ฒ์๋ฌผ์ ์ด ๊ฒ์ฒ๋ผ next()
์ ๋ํ ๋ถ์์ฉ์ take_while
๊ณผ ๊ฐ์ ์ด๋ํฐ์ ์ฐจ์ ์ ๋ฐฉ์์ผ๋ก ์ํธ ์์ฉํฉ๋๋ค. peekable
๋ฐ skip_while
.
์ด๊ฒ์ ๋ํ non-self-exhausting ๋ฐฐ์๊ตฌ ๋ฐ ๋๋ฐ์ self- exhausting iter ์ด๋ํฐ 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
๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ ๋ค๋ฅธ ์ง๋ฌธ์ ๋๋กญ ์ API ์ฌ์ฉ์ ์
๋ ฅ์ผ๋ก ๋ณผ ์ ์๋ ๊ธฐ๋ฅ์ ์คํํ๋ ๊ฒ์ด ์ข์ ์์ด๋์ด์ธ์ง ์ฌ๋ถ์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ find
, any
๋ฑ์ด ํผ๋์ค๋ฝ๊ฒ ํ๋ํ์ง ์๋๋ก ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์
๋๋ค.
๊ณ ๋ ค ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
next
๋ฅผ ์
๋ ฅํ ๋ ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ณ next
์์ ๋ฐํํ๊ธฐ ์ ์ ์ค์ ์ ํด์ ํฉ๋๋ค.๋ ๋์ ์๋ฃจ์
์ด ์์ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ฌด์์ด๋ ์ผ๋จ ๊ตฌํ๋๋ฉด Rustdoc์ ๋ฌธ์ํ๋์ด์ผ ํฉ๋๋ค.
@dathinab
๋ค, ์ด๋ฏธ ํ์ด์
๋์ถ์ ๋ฐ๋์งํ์ง ์์ง๋ง ๊ด์ฐฎ๊ณ ์ฌ๊ธฐ์์ ํผํ๊ธฐ ์ด๋ ค์ธ ์ ์์ง๋ง ์ด์ค ๋๋กญ์ ํ์คํ ์๋๋๋ค. ์ข์ ์บ์น! ์ด ์์ ๋ฌธ์ ์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ์๊ฒ ์ต๋๊น?
drain_filter
๋ ์ปฌ๋ ์
์์ ํญ๋ชฉ์ ์ ๊ฑฐํ ๋๋ง๋ค ์ฌํ ๋น์ ์ํํฉ๋๊น? ์๋๋ฉด ํ ๋ฒ๋ง ์ฌํ ๋นํ๊ณ C++์์ std::remove
๋ฐ std::erase
(์์ผ๋ก)์ฒ๋ผ ์๋ํฉ๋๊น? ๋๋ ์ ํํ ํ๋์ ํ ๋น ๋๋ฌธ์ ๊ทธ๋ฌํ ํ๋์ ์ ํธํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ํ ์ปฌ๋ ์
์ ๋์ ์์๋ฅผ ๋ฃ์ ๋ค์ ์ ์ ํ ํฌ๊ธฐ๋ก ์ถ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋ํ try_drain_filter
๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ค์งํด์ผ ํ๋ ๊ฒฝ์ฐ Option
์ ํ๊ณผ None
๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ๋ฌด์์
๋๊น? ๋๋ ๋งค์ฐ ํฐ ์ปฌ๋ ์
์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ด๊ฐ ํ์ํ ๊ฒ์ ์ด๋ฏธ ์ป์์ ๋ ๊ณ์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ด๊ฐ ๋ง์ง๋ง์ผ๋ก ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ ๋ ๋ค์๊ณผ ๊ฐ์ ์์
์ ์ํํ์ต๋๋ค. "๊ฐญ" ์์ฑ
์์๋ฅผ ์ด๋ํ๊ณ ๋ฐฐ์๋์ง ์์ ์์๋ฅผ ์ด๋ํ ๋
ํ๋๋ฅผ ์ฐพ์ ๋ ๊ฐ๊ฒฉ์ ์์. ์ด๊ฒ์ผ๋ก ๊ฐ ์์๋
์ด๋(๋ฐฐ์ด์ ์ ์์น ๋๋ ์ธ๋ถ๋ก)์ ํ ๋ฒ๋ง ์ด๋๋ฉ๋๋ค.
๋ํ remove
์ ๊ฐ์ด ์ฌํ ๋นํ์ง ์์ต๋๋ค. ํด๋ฐฉ๋ ๋ถ๋ถ์
์ฌ์ฉํ์ง ์์ ์ฉ๋์ ์ผ๋ถ.
2018๋ 8์ 10์ผ ๊ธ์์ผ 07:11 Victor Polevoy [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
drain_filter๋ ํญ๋ชฉ์ ์ ๊ฑฐํ ๋๋ง๋ค ์ฌํ ๋น์ ์ํํฉ๋๊น?
์์ง? ๋๋ ์ฌํ ๋น์ ํ ๋ฒ๋ง ์ํํ๊ณ std::remove์ ๊ฐ์ด ์๋ํฉ๋๋ค.
C++์์ std::erase(์์ผ๋ก)? ๋๋ ๊ทธ๋ฌํ ํ๋์ ์ ํธํ๊ธฐ ๋๋ฌธ์
์ ํํ ํ๋์ ํ ๋น: ๋จ์ํ ์ปฌ๋ ์ ์ ๋์ ์์๋ฅผ ๋ฃ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ ์ ํ ํฌ๊ธฐ๋ก ์ถ์ํฉ๋๋ค.๋ํ try_drain_filter๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? Option ์ ํ์ ๋ฐํํ๊ณ
๋ฉ์ถฐ์ผ ํ๋ค๋ฉด ๊ฐ์น๊ฐ ์์ต๋๊น? ๋๋ ๋งค์ฐ ํฐ ์ปฌ๋ ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ
์ด๋ฏธ ํ์ํ ๊ฒ์ ์ป์์ ๋ ๊ณ์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/43244#issuecomment-411977001 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AHR0kdOZm4bj6iR9Hj831Qh72d36BxQSks5uPRYNgaJpZM4OY1me
.
@rustonaut ๊ฐ์ฌํฉ๋๋ค. try_drain_filter
์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? :)
์ถ์ : ์ฝ๋๋ ์ดํด๋ณด๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ณตํ ๋ ์์๋ณ๋ก ์งํํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์์ํ ์ ์์ต๋๋ค.
๋๋กญ๋ ๋ ๋ฐ๋ณต์ ์ค์งํ์ง๋ง ๋๋ฌด ๋ง์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์์ต๋๋ค.
ํผ๋์ค๋ฌ์์ ์ค์ ๋ก ๋จ์ด๋จ๋ ธ์ ๋ ๋๊น์ง ๋ฐฐ์๋ฉ๋๋ค.
(์ด๋ ์ด์ค ๊ณตํฉ๊ณผ ๋ฌผ๊ฑด์ ๊ฐ๋ฅ์ฑ์ ํฌ๊ฒ ์ฆ๊ฐ์ํต๋๋ค.
๊ทธ๋ฐ).
๋ฐ๋ผ์ ๋น์ ์ฒ๋ผ ํ๋ํ๋ ์๋ ๋ฒ์ ์ ์ป์ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ต๋๋ค.
์์ํ๋ค.
๊ณต์ ์ฑ์ ์ํด ๋ฐ๋ณต์ด ์ค์ ๋ก ํผ๋์ค๋ฌ์ธ ๋ ์กฐ๊ธฐ ์ค์ง
thing.drain_where(|x| x.is_malformed()).any(|x|
x.is_dangerus())
์ ๊ฐ์ ์ผ๋ถ ์ํฉ์ ๋ชจ๋ ๊ธฐํ์ ๋ฐฐ์ํ์ง ์๊ณ ๋ค์ ์ค ํ๋๊ฐ ๋ฐ์ํ ๋๊น์ง
๋ํ ์ํํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. (ํ์ฌ Impl.์ ๋ชจ๋ ๊ธฐํ์ ๋๋ ์ธํฉ๋๋ค.
๋ฐฉ์ธ์ ๊ณ์ ๋ฐฐ์ํจ์ผ๋ก์จ).
2018๋ 8์ 10์ผ ๊ธ์์ผ 10:52 Victor Polevoy [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@rustonaut https://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
๋๋กญ์์ ํํฐ๋ง ๋ฐ ๋ฐฐ์๊ฐ ๋๊น์ง ์ํ๋๋ ๊ฒฝ์ฐ ํด์ ํ๋ ๋์ ์ ์ฌ์ ์ธ ํจ๋ ์ฌ์ด์์ ์ด๋ ค์ด ์ ํ์ด ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ด๋ ์ชฝ์ด๋ ๋ฌธ์ ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์์ ํ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํด์ ์ ๋ค๋ฅด๊ฒ ๋์ํ๋๋ก ํ๋ ๋ฐ ํน๋ณํ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
๊ฐ๋ฅ์ฑ:
๋ด๊ฐ ์๊ฐํ ์ ์๋ ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ฌ์ด ๋ฐ๋ก ์ ์ผ๋ฐ์ ์ผ๋ก drain_filter
์ ์ํด ์ ๊ณต๋๋ ๋ถ๋ณ์ ์์กดํ๋ drop
์ฝ๋์
๋๋ค(์ฆ, ๊ฒฐ๊ตญ vec์ ์์๋ ์ ํํ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์กฐ๊ฑด์ด ์คํจํจ)์ drain_filter
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋(๋๋ถ๋ถ ์ ์์ ์ด๊ณ ์์ ํ ์ฝ๋)์์ ์์๋ก ๋ฉ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๋ฌํ ๊ฒฝ์ฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด ์ฝ๋๋ ์ฌ์ฉ์๊ฐ ์ด๋ป๊ฒ ์์ฑํ๋ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ญ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๊ณ ์์๋ฅผ ๊ต์ฒดํ๋ ๋ช
๋ นํ ๋ฃจํ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ํด๋น ์กฐ๊ฑด์ด ํจ๋ ์ํ๊ฐ ๋ ์ ์๊ณ ๋๋กญ impl์ด ํํฐ ์กฐ๊ฑด์ด false์ธ ๊ฒ์ ํฌ๊ฒ ์์กดํ๋ ๊ฒฝ์ฐ ์ฝ๋์๋ ์ฌ์ ํ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. drop_filter
์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ ๋ฌธ์๊ฐ ์ด ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ ์ฃผ์๋ฅผ ํ๊ธฐ์ํฌ ์ ์๋ ๊ฒ์ ๋น๊ตํ๋ฉด ๊ฐ์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ํ์ฌ ๊ตฌํ ์ด ์ฌ์ ํ ์์๋ฅผ ์ด์ค ๋๋กญ ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์ค๋ ๋์ ์๋ถ๋ถ์ ๊ฒ์๋ ์ด ํ๋ ์ด๊ทธ๋ผ์ด๋ ์์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. (๊ทธ๋์ ์ด๋๋ก๋ ์ ๋ ์์ ๋ ์ ์๋ค!)
๊ฑด์ ์ฑ ๋ฒ๊ทธ์ ๋ํ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์์ต๋๊น? ๊ทธ๋ฐ ๋ค์ I-unsound๋ก ํ์๋ ์ ์์ต๋๋ค.
๋ด๊ฐ ์๋ ํ ๋น์ ์ ํ์๋ฅผ ํ ์ ์๊ฑฐ๋ ๋๋ธ ํจ๋๋งํผ ๊ฑด์ ํ์ง ์์ต๋๋ค _๊ฑด์ ํฉ๋๋ค_
์ค๋จ๋ ๋ ๋งค์ฐ ๋ถํธํฉ๋๋ค. ๋ํ ๋ด๊ฐ ๊ธฐ์ตํ๋ ํ
์ด์ค ํจ๋์ ๊ฐ๋ฅ์ฑ์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์๋ฌต์ ์ธ ํ๋์ด์ง๋ง
๊ณ ์๋ก ์ ํํ.
์ต์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋ ๋ค๋ฅธ ๋ง๋ก ํ๋ฉด 1. ์ ์์ ์ธ ์ฌ์ฉ ์ฌ๋ก์์ ํผ๋์ ์ผ๊ธฐํ๊ณ , 2.
์ ์ด๊ฐ ๋นํฉํ ์ ์๋ ๊ฒฝ์ฐ ์ค๋จํ๊ธฐ 3.,4. ๋น์ ์ด ์ ๋ง๋ก ํ ์ ์๋๋กํ์ญ์์ค
drop ๋ฉ์๋์์ ์ฌ์ฉํ์ง๋ง ์ด์ ๊ฑฐ๊ธฐ์์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ด ์ต์
์ ๊ฒฐ๊ณผ๋ก 3.,4. ๊ธ์ง๋์ด ์์ต๋๋ค. ์ต์
2์ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1.์ ์๋ ๊ฒ๋ณด๋ค ๋ ํฌ๊ทํ๋ฏ๋ก 2.๊ฐ ์ ํ๋์์ต๋๋ค.
IMHO ์คํ๋์ง ์๋ drain+drain_filter API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋กญ ์ ์๋ฃ + ๋ค์์ผ๋ก ์คํ๋๋ ์ผ๋ฐ ๋ฐ๋ณต์ ๊ฒฐํฉ๊ธฐ
์ญ์ ์ ์๋ฃ + ๋ฐ๋ณต์๋ฅผ ์๋ฃํ์ง๋ง ๋ชจ๋ ์ญ์ ํ๋ ๋ฉ์๋
๋๋จธ์ง ํญ๋ชฉ. ๋ฌธ์ ๋ ๋ฐฐ์๊ฐ ์ด๋ฏธ ์์ ์ ์ด๊ณ ๋ฐ๋ณต์๊ฐ
๊ฒฐํฉ์๋ ๋ด๋ถ ๋ฐ๋ณต์์ ๋๋ ์ธ์ ์ตํฉํด์ผ ํ๋ฏ๋ก ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ ํ ์ด๋ฆ์ด ์๋ ์ ์์ต๋๋ค.
2019๋ 5์ 20์ผ ์์์ผ 09:28 Ralf Jung ์๋ฆผ @github.com ์์ฑ:
๊ฑด์ ์ฑ ๋ฒ๊ทธ์ ๋ํ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์์ต๋๊น? ๊ทธ ์
๊ทธ๋ฐ ๋ค์ I-unsound๋ก ํ์๋ฉ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/43244?email_source=notifications&email_token=AB2HJEL7FS6AA2A2KF5U2S3PWJHK7A5CNFSM4DTDLGPKYY3PNVWWK3TUL52HS4DFVEXG43VMXVB
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AB2HJEMHQFRTCH6RCQQ64DTPWJHK7ANCNFSM4DTDLGPA
.
๊ทธ๋ฌ๋ ๋๋ธ ๋๋กญ ์ ๊ฑด์ ํ์ง ์์ต๋๋ค.
๊ฑด์ ์ฑ ๋ฌธ์ ๋ฅผ ์ํด ์์ฑ๋ #60977
๊ฐ์ฌํฉ๋๋ค. Double Panic :man_facepalming: ์ผ๋ก double drop์ ์ฝ๋ ๊ฒ์ด ์ด๋ฆฌ์์ ๊ฒ ๊ฐ์ต๋๋ค.
- => ๊ณตํฉ ์ํ์ ๋น ์ง๋ ๊ฒ๊ณผ ๋ฐ๊นฅ์ ์์ ๋์ ์์์น ๋ชปํ ์ฐจ์ด. ๋จ์ง
drop ํจ์์์ drain_filter๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ ๊ณ ๋ คํ์ญ์์ค.
3.,4. ๋น์ ์ด ์ ๋ง๋ก ํ ์ ์๋๋กํ์ญ์์ค
drop ๋ฉ์๋์์ ์ฌ์ฉํ์ง๋ง ์ด์ ๊ฑฐ๊ธฐ์์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋์๊ฒ ์ฌ์ ํ ํฐ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
๋๊ตฐ๊ฐ ํจ๋ ์ํ๊ฐ ๋ ์ ์๋ Drop impl์์ 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
์ ๊ฒฝ์ฐ ์ค์ ๋ก ๋ ๊ฐ์ ์ถ๋ ฅ์ด ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐํ ๊ฐ๊ณผ ์๋ ์ปฌ๋ ์
์ด๋ฉฐ ์ด๋ ์ชฝ์ด "ํํฐ๋ง"๋์๋์ง ๋ช
ํํ์ง ์์ต๋๋ค. ํญ๋ชฉ์ด ๊ณ์๋ฉ๋๋ค. 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
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
๊ฐ์ด iterator์ ์ํด ์ฆ์ ์ฐ์ถ๋์ง ์์๊น์?
์ฌ์ค, ๊ทธ ํจ์์ ์
๋ ฅ ๊ฐ์ ์ฌ์ ํ 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
์ ๋จ์ ์๋ ๊ฐ์ ์ต๋ ํ ๋ฒ๋ง ์ด๋๋ฉ๋๋ค.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,
}
๋ง์ง๋ง์ผ๋ก ์ ์ํ๊ณ ์ถ์ ์ต์ ์ ๋ฐ๋ณต์๋ฅผ ์์ ํ ์์ ๊ณ , ํญ๋ชฉ์ ๊ฐ์ผ๋ก ํด๋ก์ ์ ์ ๋ฌํ๊ณ , ํธ์ถ์๊ฐ ํญ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ๋๋ก ๋๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
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
์ ๋ด์ฉ์
๋๋ค.
(BTW, ๋๋ ์ด ๋ฌธ์ ์ ์ ๋ชฉ์ ๋ณด๊ธฐ ์ ๊น์ง ์์ ํ ์์ด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ์์ ์ฐ๊ฒฐ ๋ชฉ๋ก์ ์์ ํ ๋ฌด์ํ์ต๋๋ค. ์ฐ๊ฒฐ ๋ชฉ๋ก์ ๋ํด ์ด์ผ๊ธฐํ๋ฉด ํฌ์ธํธ 4-6์ ๋ถ์์ ๋ณ๊ฒฝํ๋ฏ๋ก ๋ค๋ฅธ ์๊ฐ์ ๋๋ค. API๋ ์ฐ๊ฒฐ ๋ชฉ๋ก์ ์ ํฉํฉ๋๋ค.)
@johnw42 3. ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ mem::replace
๋๋ mem::take
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ํ ์ ์์ต๋๋ค.
@johnw42 @jplatte
(3) ๋ฐํ๋ Iterator
์ ํญ๋ชฉ ์ ํ์ด ์ปฌ๋ ์
์ ํญ๋ชฉ ์ ํ๊ณผ ๋ค๋ฅธ ๊ฒ์ ํ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ์ค์ ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค.
(3)์ Iterator
์์ ์์๋ฅผ ๋ฐํํ๊ณ Vec
์ ์ ์์๋ฅผ ๋ค์ ๋ฃ์ผ๋ฏ๋ก ํน๋ณํ ๊ฒฝ์ฐ์
๋๋ค.
Bikeshedding: Replace(T)
์ ๊ธฐ๋ฅ์ ์ฝ๊ฐ ๋ฐ๋๋ก ํ๊ณ PushOut(T)
PushOut
์ ๋ด๋ถ ๊ฐ์ ๋ฐ๋ณต์์ "์ ์ถ"ํ๋ ๋ชฉ์ ์ผ๋ก Vec
์ ์๋ณธ(๋งค๊ฐ๋ณ์) ํญ๋ชฉ.
Stop
๋ ์๋ง๋ Error
์ ํ์ ๋ฐํํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค(๋๋ try_fold
์ฒ๋ผ ์ฝ๊ฐ ์๋ํฉ๋๊น?).
์ด์ ฏ๋ฐค์ super_drain_by_value
๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ๋ช ๊ฐ์ง๋ฅผ ๋ฐฐ์ ์ต๋๋ค.
ํค๋๋ผ์ธ ํญ๋ชฉ์ ์๋ง๋ Vec
wrt ์ด์์ด์ด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ด์ผ๊ธฐํ๋ ๋ชจ๋ ๊ฒ์ (๊ทผ๋ณธ์ ์ผ๋ก ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก) "์์ผ๋ฉด ์ข์" ๋ฒ์ฃผ์ ์ํด์ผ ํฉ๋๋ค. ์๋ํ๋ฉด Vec
๋ ์ด๋ฏธ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ์กด API๋ฅผ ํตํด ๋ชจ๋ ํ๋์ ๋ํ ์ง์ ์ ์ธ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ ๋ฒ์ ์๋ ๋น์ด ์๋ Vec
์ ํฌ์ธํฐ ํ๋๋ฅผ ๊ด์ฐฐํ ์ ์๋ค๋ ์์ ๊ฒฝ๊ณ ๊ฐ ์์ง๋ง ๋ถ์์ ํ into_raw_parts
๋ฉ์๋๋ ํด๋น ์ ํ์ ์ ๊ฑฐํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ๋งํ๋ ๊ฒ์ ์์ ํ ์ฝ๋๋ก ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋ ์์
์งํฉ์ ํ์ฅํ๋ ๊ฒ์
๋๋ค.
์ฝ๋ ์์ฑ์ ๊ด์ ์์, ์ฌ์ด ๊ฒฝ์ฐ(์: Vec<i32>
)์์ Vec
์ํ์ผ๋ก์ ์ค๋ณต ์ด๋์ ๋ฌธ์ ๊ฐ ๋์ง ์์ผ๋ฉฐ ํธ์ถ์ ๋ค์๊ณผ ๊ฐ์ ๋จ์ํ ๋ฌธ์ ์ ํด๋นํฉ๋๋ค. no-op ๋๋ Vec
์๋ฅด๊ธฐ๋ ๊ฐ์ ํ๊ธฐ์๋ ๋๋ฌด ๊ฐ๋จํ ์ฝ๋๋ก ๋ณํ๋ฉ๋๋ค(๊ฐ๊ฐ 0๊ฐ ๋ฐ 3๊ฐ ๋ช
๋ น์ด). ๋์ ์์์ ๋ ์ด๋ ค์ด ๊ฒฝ์ฐ์ ๋ด ์ ์๊ณผ drain_filter
๋ฉ์๋ ๋ชจ๋ ๋ถํ์ํ ๋ณต์ฌ๋ฅผ ๋ง์ด ํ์ฌ ๋ฉ์๋์ ๋ชฉ์ ์ ํฌ๊ฒ ์์ํ๋ค๋ ๊ฒ์
๋๋ค. Vec<[u8; 1024]>
์ ๋ํด ์์ฑ๋ ์ด์
๋ธ๋ฆฌ ์ฝ๋๋ฅผ ๋ณด๊ณ ํ
์คํธํ์ผ๋ฉฐ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ ๋ฐ๋ณต์๋ ์ต์ ํ๋์ง ์์ memcpy
์ ๋ํ ๋ ๊ฐ์ ํธ์ถ์ด ์์ต๋๋ค. no-op ํธ์ถ์กฐ์ฐจ๋ ์ ์ฒด ๋ฒํผ๋ฅผ ๋ ๋ฒ ๋ณต์ฌํ๋ ๊ฒ์ผ๋ก ๋๋ฉ๋๋ค!
์ธ์ฒด ๊ณตํ์ ๊ด์ ์์ ๋ณด๋ฉด, ์ธ๋ป ๋ณด๊ธฐ์ ๊ฝค ๊ด์ฐฎ์ ๋ณด์ด๋ ๋ด API๊ฐ ์ค์ ๋ก๋ ๊ทธ๋ค์ง ์ข์ง ์์ต๋๋ค. ํด๋ก์ ์์ ์ด๊ฑฐํ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ๊ฐ์ฅ ๋จ์ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๋งค์ฐ ์ฅํฉํ๋ฉฐ, ํด๋ก์ ๊ฐ ์ด๊ฑฐํ ๊ฐ ์์ ๋ฐํํ๋ ๊ฒฝ์ฐ ๋ด๊ฐ ์ ์ํ ๋ณํ์ ํจ์ฌ ๋ ์ถ์ ํฉ๋๋ค.
๋๋ ๋ํ super_drain_by_value
์์ Option<R>
$ ๋ก ๋ฐํ๋ R
๊ฐ์ ์ ๋ฌํ๊ธฐ ์ํด DrainAction::Stop
๋ฅผ ํ์ฅํ๋ ค๊ณ ์๋ํ์ต๋๋ค. ๋ฐํ๋ ๊ฐ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ R
๋ฅผ ์ ์ถํ ์ ์์ผ๋ฉฐ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ ์ ํ์ ๋ช
์์ ์ผ๋ก ์ฃผ์์ ๋ฌ์์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก super_drain_by_value
ํธ์ถ์์๊ฒ ํด๋ก์ ์์ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ์ง์ํ๋ ๊ฒ์ ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. loop {}
๊ตฌ๋ฌธ์ด ๊ฐ์ ๋ฐํํ ์ ์์ง๋ง ๋ค๋ฅธ ์ข
๋ฅ์ ๋ฃจํ๊ฐ ()
๋ก ํ๊ฐ๋๋ ์ด์ ์ ๋๋ต ์ ์ฌํฉ๋๋ค.
์ผ๋ฐ์ฑ๊ณผ ๊ด๋ จํ์ฌ ์ ๋ ์กฐ๊ธฐ ์ข
๋ฃ์ ๋ํด ์ค์ ๋ก ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์์ ๊นจ๋ฌ์์ต๋๋ค. ํ๋๋ Vec
์ ๋๋จธ์ง ๋ถ๋ถ์ด ์ญ์ ๋๊ณ ๋ค๋ฅธ ํ๋๋ ์ ์๋ฆฌ์ ๋จ์ ์์ต๋๋ค. ์กฐ๊ธฐ ์ข
๋ฃ๊ฐ ๊ฐ์ ์ ๋ฌํ์ง ์์ผ๋ฉด(๋ด ์๊ฐ๋๋ก) ์๋ฏธ์ Keep(n)
๋๋ Drop(n)
๋ฐํํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ์ฌ๊ธฐ์ n
๋ ์์ง ๊ฒํ ๋์ง ์์ ํญ๋ชฉ. ๊ทธ๋ฌ๋ Keep
/ Drop
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ๋ ๊ฐ๋จํ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ํตํด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธฐ ์ข
๋ฃ๋ ๋ณ๋์ ๊ฒฝ์ฐ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
API๋ฅผ ์ข ๋ ์น์ํ๊ฒ ๋ง๋ค๋ ค๋ฉด ํด๋ก์ ๊ฐ ()
๋ฅผ ๋ฐํํ๊ณ ์ด๋ฅผ ํฌํผ ๊ฐ์ฒด(์ฌ๊ธฐ์ "์
๋ฐ์ดํฐ"๋ผ๊ณ ์นญํจ)์ ์ ๋ฌํ๋ ๊ฒ์ด ๋ ๋์ ์ต์
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Vec
์ ๊ฐ ์์๋ฅผ ๊ฒ์ฌํ๊ณ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ ์ดํ๋ โโ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฉ์๋๋ keep_next(n)
๋๋ drop_remainder()
์ ๊ฐ์ ์ถ๊ฐ ๋ฉ์๋์ ํจ๊ป borrow
, borrow_mut
๋ฐ take
์ ๊ฐ์ ์น์ํ ์ด๋ฆ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ์ข
๋ฅ์ API๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ ๊ฒฝ์ฐ์ ํด๋ก์ ๊ฐ ํจ์ฌ ๊ฐ๋จํด์ง๊ณ ๋ณต์กํ ๊ฒฝ์ฐ์๋ ๋ ๋ณต์กํ์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ์
๋ฐ์ดํฐ ๋ฉ์๋๊ฐ ๊ฐ์ผ๋ก self
๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ฉด ํธ์ถ์๊ฐ take
๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ๊ฑฐ๋ ํ์ ๋ฐ๋ณต์์ ์ํํ ์์
์ ๋ํด ์ถฉ๋ํ๋ ์ง์นจ์ ์ ๊ณตํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ฝ์ต๋๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ฌ์ ํ ๋ ์ํ ์ ์์ต๋๋ค! ๋๋ ์ค๋ ์์นจ์ ์ข ์ข ๊ทธ๋ ๋ฏ์ด ์ด ๋ฌธ์ ๊ฐ ํจ์ํ ์ธ์ด์์ ํ์คํ ํด๊ฒฐ๋ ๋ฌธ์ ์ ์ ์ฌํ๋ฉฐ ์ ์ฌํ ์๋ฃจ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋๋ OCaml์ ์ํ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์งง์ ๋ฌธ์ ์์ ์ฒ์ ์ค๋ช ํ๊ณ Haskell ์ฝ๋์ ๋ค๋ฅธ ๊ด๋ จ ๋ฌธ์์ ๋ํ ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๊ธฐ ์ ์ค๋ช ๋ "zipper" API์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์งํผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ํ๊ณ ํน์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ง์ํ๋ ์์ ์ ์ฌ์ฉํ์ฌ "์ ์๋ฆฌ์์" ์ ๋ฐ์ดํธํ๋ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๊ฒ์ ์๊ฐํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์งํผ๊ฐ ํน์ ์ ํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํ ์์ ์ ์ํํ๊ธฐ ์ํ ์ถ๊ฐ ๋ฐฉ๋ฒ์ด ์๋ ์ผ์ข ์ ํฐ๋ณด์ฐจ์ ๋ฐ๋ณต๊ธฐ๋ผ๋ ๊ฒ์ ๋๋ค.
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
๋ฅผ ์ฌ์ฉํ๋ ๊ฑฐ์ ๋์ผํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋ค๋ง ์ผ์ฐ ๋ฉ์ถ๋ ์ฒํ๋ ๊ฒ๋ฟ์
๋๋ค. ๊ฑฐ์ ๊ฐ์ ์์ ์ฝ๋์ด์ง๋ง IMHO ํด๋ก์ ์์ ๋ฐํ๋ ๊ฐ์ ์๋ฏธ๊ฐ ๋ช
ํํ์ง ์๊ณ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ถ์ธ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ฐ๋ณต์์ ๋ค์ ๋ฐ๋ณต์ผ๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ด๋ ต์ต๋๋ค. ๋ฒ์ ์ ์ ์ด ํ๋ฆ๊ณผ ๋์ผํ ์์
์ ์ํํฉ๋๋ค. ์ ๊ฑฐ๋ ํญ๋ชฉ์ ํญ์ ๋ฐ๋ณต์์ ์ํด ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅ์์ โโ์์ ๊ฐ์ ์ ๊ฑฐํ๋ ค๋ฉด ๋ณ๋์ ํํฐ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค. ์ฆ, ํ ๊ณณ์ด ์๋ ๋ ๊ณณ์์ ์์ ๊ฐ์ ํ์ธํด์ผ ํฉ๋๋ค. 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
crate , ํนํ Remover
struct ๊ฐ ๋ ์ฌ๋๊ณ ์ธ๊ธํ "์งํผ" ๊ฐ๋
์ด ๋งค์ฐ ์ ์ฌํด ๋ณด์
๋๋ค! ๊ทธ๊ฒ์ ์์ ํ ์ ์ด๋ฅผ ์ํ ๋ ํ์๋ฅผ ์ทจํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ํจ์ฌ ๋ ์ธ์ฒด ๊ณตํ์ ์ผ๋ก ๋ณด์
๋๋ค.
์ด๋ ์ชฝ์ด๋ , ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋์ค์ ์ธ์ ๋ ์ง ๋ด๋ถ๋ฅผ ๊ต์ฒดํ ์ ์๊ธฐ ๋๋ฌธ์ 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
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ์ธ ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ช
ํ์ฑ์ ์ํด ์ฌ์ ํ ์ด์์ ์ด์ง ์์ง๋ง ๋งค์ฐ ์ ์๋ ค์ง ๊ธฐ๋ฅ์ด๋ฉฐ IMHO๋ ์ ์ด๊ฐ "์ด๊ฒ์ ์ ์งํด์ผ ํ๋์?"๋ผ๋ ์ง๋ฌธ์ ๋๋ตํ๋ ๊ฒ์ด ์ ์ด๋ ๋ค์ ์ง๊ด์ ์
๋๋ค. "์ด๊ฒ์ ๋ฒ๋ ค์ผ ํ๋?"๋ณด๋ค drain_filter
๋ฅผ ์ฌ์ฉํ์ฌ iterator์ ๊ด์ ์์ ์๊ฐํ๋ฉด ๋์ผํ ๋
ผ๋ฆฌ๊ฐ ์ ์ฉ๋์ง๋ง ์
๋ ฅ Vec
์ ๊ด์ ์์ ์๊ฐํ๋ฉด "should I NOT ์ด๊ฑฐ ๊ฐ๊ณ ์์ด?"
์ ํํ ํํ์ ๊ดํด์๋ 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_์ ํํฐ๋งํ๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ์ด์ ์ด ์์ต๋๋ค. ์ด๋ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๊ธฐ์ตํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. std
์ _where
์ ๋ฏธ์ฌ์ ๋ํ ์ ๋ก๋ ์์ง๋ง ์ ์ฌํ ์ ๋ฏธ์ฌ์ ๋ํ ์ ๋ก๋ ๋ง์ต๋๋ค.where
drain().where()
์ ๋ณํ์
๋๋ค.drain_retain
: retain
์ ์ผ์นํ์ง๋ง retain
๋ฐ drain
๋ ํด๋ก์ ์์ ๋ฐํ๋ ๋ถ์ธ ๊ฐ์ ๋ํด ๋ฐ๋ ํด์์ ํ๋ฏ๋ก ํผ๋๋ ์ ์์ต๋๋ค.filtered_drain
drain_if
drain_when
remove_if
drain
์์ ์ผ๊ด์ฑ์ ์ํด range ์ธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
FnMut(&mut T) -> bool
๋ฐ FnMut(T) -> Result<T, U>
์ ๋ ๊ฐ์ง ํ์ ํ์์ด ์ ์๋์์ต๋๋ค. ํ์๋ ๋ ์ ์ฐํ์ง๋ง ๋ ์ํด๋ค.
retain
์ ์ผ์นํ๋๋ก ๋ถ์ธ ์กฐ๊ฑด( true
์ " Vec
์ ์ ์ง"๋ฅผ ์๋ฏธ)์ ๋ฐ์ ์ํค๋ ๊ฒ์ด ๋
ผ์๋์์ง๋ง drain
์ ์ผ์นํ์ง ์์ ๊ฒ์
๋๋ค. true
๋ " Vec
์์ ๋ฐฐ์"๋ฅผ ์๋ฏธ).
ํํฐ ํด๋ก์ ํจ๋์ด ๋ฐ์ํ๋ฉด DrainFilter
๋ฐ๋ณต์๊ฐ ์ญ์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฐ๋ณต์๋ Vec
๋ฐฐ์๋ฅผ ์๋ฃํด์ผ ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด ํํฐ ํด๋ก์ ๋ฅผ ๋ค์ ํธ์ถํด์ผ ํ๋ฏ๋ก ์ด์ค ํจ๋์ ์ํ์ด ์์ต๋๋ค. ๋ช ๊ฐ์ง ์๋ฃจ์
์ด ์์ง๋ง ๋ชจ๋ ์ ์ถฉ์์
๋๋ค.
๋จ์ด๋จ๋ฆฌ๋ ๊ฒ์ ๋๋ด์ง ๋ง์ญ์์ค. ์ด๊ฒ์ find
๋๋ all
์ ๊ฐ์ ์ด๋ํฐ์ ํจ๊ป ์ฌ์ฉํ ๋ ์๋นํ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ๋ฐ๋ณต์๊ฐ ๊ฒ์ผ๋ฅด๋ฏ๋ก v.drain_filter(...);
๊ด์ฉ๊ตฌ๋ฅผ ์ธ๋ชจ์๊ฒ ๋ง๋ญ๋๋ค.
ํญ์ ๋๋กญ ์ ๋ฐฐ์๋ฅผ ์๋ฃํ์ญ์์ค. ์ด๊ฒ์ ๋ ๋ฐฐ์ ํจ๋(์ค๋จ์ ์ด๋ํจ)์ ์ํ์ด ์์ง๋ง ๋์์ ์ผ๊ด๋๊ฒ ๋ง๋ญ๋๋ค.
ํ์ฌ ํ๊ณ ์์ง ์์ ๊ฒฝ์ฐ์๋ง ๋๋กญ ์ ๋ฐฐ์๋ฅผ ์๋ฃํฉ๋๋ค. ์ด๋ ์ด์ค ํจ๋์ ์์ ํ ์์ ํ์ง๋ง drain_filter
DrainFilter
๋์์ ์์ธกํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
ํํฐ ํด๋ก์ ๊ฐ ํจ๋ํ์ง ์์ ๊ฒฝ์ฐ์๋ง ๋ฐฐ์๋ฅผ ์๋ฃํ์ญ์์ค. ์ด๊ฒ์ drain_filter
๊ฐ ๋ง๋ ํ์ฌ ์ ์ถฉ์์
๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ข์ ํน์ฑ์ ํํฐ ํ์ "๋จ๋ฝ"์์ ํจ๋์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ธ๋ฐ, ์ด๋ ํ๋ฆผ์์ด ๋งค์ฐ ์ง๊ด์ ์
๋๋ค.
ํ์ฌ ๊ตฌํ์ ๊ฑด์ ํ๊ณ DrainFilter
๊ตฌ์กฐ์ฒด๊ฐ ์ญ์ ๋๋ ํ ์ ๋ ๋์ถ๋์ง ์์ต๋๋ค(์ค๋จ์ ์ ๋ฐํ ์ ์์ง๋ง). ๊ทธ๋ฌ๋ ์ด์ ๊ตฌํ์ ์์ ํ๊ฑฐ๋ ๋์ถ์ด ์์์ต๋๋ค.
DrainIter
๋ ์์ค ๋ฒกํฐ๊ฐ ์ญ์ ๋ ๋ ๋ฐฐ์ถ์ ์๋ฃํ๊ฑฐ๋ next
๊ฐ ํธ์ถ๋ ๋๋ง ๋ฐฐ์ถ๋ ์ ์์ต๋๋ค(์ง์ฐ ๋ฐ๋ณต).
Drain-on-Drop์ ์ฐฌ์ฑํ๋ ์ฃผ์ฅ:
drain
์ ๋์๊ณผ ์ผ์นํฉ๋๋ค.
all
, any
, find
๋ฑ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ด๋ํฐ์ ์ ์ํธ ์์ฉํฉ๋๋ค.
vec.drain_filter(...);
๊ด์ฉ๊ตฌ๋ฅผ ํ์ฑํํฉ๋๋ค.
๊ฒ์ผ๋ฅธ ๊ธฐ๋ฅ์ drain_lazy
์คํ์ผ ๋ฉ์๋ ๋๋ DrainIter
(์ฌ์ง์ด Drain
์์๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ฏ๋ก lazy()
์ด๋ํฐ)๋ฅผ ํตํด ๋ช
์์ ์ผ๋ก ํ์ฑํํ ์ ์์ต๋๋ค. ๋ฉ์๋ ์ถ๊ฐ).
์ง์ฐ ๋ฐ๋ณต์ ์ฐฌ์ฑํ๋ ์ฃผ์ฅ:
๊ฑฐ์ ๋ชจ๋ ๋ค๋ฅธ ๋ฐ๋ณต์์ ์ผ์นํฉ๋๋ค.
"drain-on-drop" ๊ธฐ๋ฅ์ DrainIter
์ ์ด๋ํฐ๋ฅผ ํตํด ๋๋ ์ผ๋ฐ Iterator::exhausting
์ด๋ํฐ๋ฅผ ํตํด ๋ช
์์ ์ผ๋ก ํ์ฑํ๋ ์ ์์ต๋๋ค(RFC #2370 ์ฐธ์กฐ).
์ ๊ฐ ๋์น ๋ถ๋ถ์ด ์์ ์๋ ์์ง๋ง, ์ ์ด๋ ์ค๋ ๋๋ฅผ ํ์ด๋ณผ ๋ ์ด๋ณด์์๊ฒ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค.
@negamartin
drain-on-drop
์ต์
์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ๋ณต์๊ฐ ์์ ํ ๊ฐ ๋์ ํญ๋ชฉ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐํํด์ผ ํ์ง ์์ต๋๊น? ํน์ ์กฐ๊ฑด(๋ด ์๋ ์ฌ์ฉ ์ฌ๋ก)๊ณผ ์ผ์นํ๋ ํญ๋ชฉ์ ์ ๊ฑฐํ๊ณ ์์ ๊ถ์ ๊ฐ์ ธ์ค๋ ๋ฉ์ปค๋์ฆ์ผ๋ก drain_filter
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์์ต๋๋ค. ํ์ฌ ๊ตฌํ์ ๋์์ ์์ ํ ๊ฐ์ ์ฐ์ถํ๋ฉด์ ์ ํํ๊ฒ ์์ง๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ์ชฝ์ด๋ , ๋๋ ๋๋ ์ธ-์จ-๋๋กญ์ด ์ฐจ์ฉ ์์๋ฅผ ํ์๋ก ํ๋์ง ์์ง ๋ชปํ๋ฏ๋ก, ๋๋ ์ธ-์จ-๋๋กญ์ ์๋ฏธ์ ๋ํด ๋ ๊ฐ์ง ๋ค๋ฅธ ์์ด๋์ด๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ถ๋ช ํ ํ์๋ฉด, ๋ด๊ฐ drop-on-drop์ด๋ผ๊ณ ํ ๋ ๋ฐ๋ณต์๊ฐ ์์ ํ ์ฌ์ฉ๋์ง ์์์ ๋์ ๋์๋ง์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ณต์๊ฐ ์์ ํ ์ฌ์ฉ๋์ง ์๋๋ผ๋ ํด๋ก์ ์ ์ผ์นํ๋ ๋ชจ๋ ํญ๋ชฉ์ด ๋ฐฐ์๋์ด์ผ ํฉ๋๊น? ์๋๋ฉด ์๋ชจ๋ ์์๊น์ง๋ง ์ฌ์ฉํ๊ณ ๋๋จธ์ง๋ ๊ทธ๋๋ก ๋๋์?
ํนํ ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
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
๋ฅผ ๋ฐํํ๋ ์์๋ ๋ฐฐ์ํฉ๋๋ค!
๋ฐฉ๊ธ #RFC 2870 lib ํ์ ์ฝ๋ฉํธ์์ ์์ ์ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ฐ๋ฅ์ฑ์๋ ๋ฉ์๋๋ฅผ ์ผ๋ฐํํ๊ฑฐ๋ ๋น๋ ํจํด์ "์ค๋ฒ๋ก๋"ํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์ด์ ์ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ์ฌ์ ํ ์๋ฝํ๋ ๊ฒฝ์ฐ ๋ฉ์๋๋ฅผ ์ ๋ค๋ฆญ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์ด์ ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ๊ทธ๊ฒ์ด ์ต์ ์ ๊ธธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
(๋น๋ ํจํด์ ๋ฐ๋ณต์์ ๋ฉ์๋๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋์ ๋ณ๊ฒฝ์๊ฐ ์๋๋ผ ์ด๋ํฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต์์ ๊ฒฝ์ฐ ์ฝ๊ฐ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. ๊ฒ๋ค๊ฐ chunks
๋ฐ chunks_exact
๋ ๋ ๊ฐ์ ๋ณ๋ ๋ฉ์๋์
๋๋ค. , chunks().exact()
์ฝค๋ณด๊ฐ ์๋๋๋ค.)
์๋์, ๋ด๊ฐ ์๋ ํ ํ์ฌ ๋์์ธ์ด ์๋
์ ํ ๋ชจํธ์ฑ์ผ๋ก ์ธํด ์ด์ ์ ์๋ํ๋ ๊ฒ์ด ์ด์ ์คํจํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ์ ์ ํ
ํจ์์ ๋ํ ์ ํ์ด ๋์์ด ๋์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๊ธฐ๋ ๋งค์ฐ ๊น๋ค๋กญ์ต๋๋ค.
2020๋ 6์ 12์ผ ๊ธ์์ผ 21:21 negamartin [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ฐฉ๊ธ #RFC 2870์ ์๋ lib ํ์ ์ฃผ์์์ ์์ ์ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
https://github.com/rust-lang/rfcs/pull/2369 :๊ฐ๋ฅ์ฑ์๋ ์ผ๋ฐํํ์ฌ ๋ฉ์๋๋ฅผ "์ค๋ฒ๋ก๋ฉ"ํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
๋๋ ๋น๋ ํจํด.์ฌ์ ํ ํ์ฉํ๋ ๊ฒฝ์ฐ ๋ฉ์๋๋ฅผ ์ ๋ค๋ฆญ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์ด์ ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๊น?
์ด์ ์ฝํฌ๋ฆฌํธ ์ ํ? ๊ทธ๋ ๋ค๋ฉด ๊ทธ๊ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์์ผ๋ก.(๋น๋ ํจํด์ ๋ฐ๋ณต์์์ ์ฝ๊ฐ ์ง๊ด์ ์ด์ง ์์ต๋๋ค.
๋ฐ๋ณต์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ๋ณ๊ฒฝ์๊ฐ ์๋๋ผ ์ด๋ํฐ์ ๋๋ค. ๊ฒ๋ค๊ฐ ์๋ค
์๋ฅผ ๋ค์ด, chunks์ chunks_exact๋ ๋ณ๊ฐ์ ๋ ๊ฐ์ง์ ๋๋ค.
chunks().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()
๋ ์ฌ์ ํ ์ ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ก์ด ๋ถ์์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ API์ ๋ํ @BartMassey , ๊ตฌํ์ผ๋ก PR์ ๋ง๋๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ฅ ๊ตฌํ์ ๋ํ ์ง์นจ์ https://rustc-dev-guide.rust-lang.org/implementing_new_features.html ๋ฐ https://rustc-dev-guide.rust-lang.org/getting-started.html ์ ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ๊ธฐ ์ํ
์ ๋ ์ค๋ 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๋ฅผ ์๋ฐํ๋ ๊ฒ์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ด ์์ ํ๋๋ ๊ฒ์ ๋ฐฉํดํ๋ ๊ฒ์ด ์์ต๋๊น?