Rust: Vec::drain_filter ๋ฐ LinkedList::drain_filter์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ

์— ๋งŒ๋“  2017๋…„ 07์›” 15์ผ  ยท  119์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

    /// 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 ๋“ค์–ด์˜ค๋Š” ์ค‘.

A-collections B-unstable C-tracking-issue Libs-Tracked T-libs

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์ด ์•ˆ์ •ํ™”๋˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“  119 ๋Œ“๊ธ€

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋ถ€์—Œ ์‹ฑํฌ๋Œ€๋ฅผ ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ๋ฒ”์œ„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ _ํ•  ์ˆ˜_ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐ์ˆ˜๊ด€์˜ ์ƒ์œ„ ์ง‘ํ•ฉ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒฝ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋‹จ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹นํ™ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 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 ๋ฅผ ์‚ฌ์šฉํ•œ ์„ ๋ก€๋Š” ์—†์Šต๋‹ˆ๋‹ค.

@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 ์˜ ๊ตฌ์„ฑ์›์ž…๋‹ˆ๋‹ค.

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 ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐฐ์ˆ˜๊ตฌ์˜ ํ•œ ํ˜•ํƒœ์ด๋ฏ€๋กœ ์ด๋ฆ„์— ๋ฐฐ์ˆ˜๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  2. where ๋ฅผ drain ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด
    ์š”์†Œ _where_ ์ˆ ์–ด๊ฐ€ true์ด๋ฉด ๋ฐฐ์ˆ˜๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ œ๊ฑฐ๋˜๊ณ  ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

  3. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ 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์—์„œ ์ด๋ฆ„์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜:

  1. ๊ด€๋ จ๋œ ์ƒ์‚ฐ/์†Œ๋น„ ๊ฐœ๋…์ด ์žˆ๋Š” ์ˆ ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค(wrt. rust, iterations). ์˜ˆ๋ฅผ ๋“ค์–ด drain , collect , fold , all , take , ...
  2. ์ด ์ˆ ์–ด์—๋Š” *_where , *_while ์™€ ๊ฐ™์€ ์ˆ˜์ •์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ˆ˜์ • ์†์„ฑ์ด ์žˆ๋Š” ์ˆ ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค( map , filter , skip , ...)

    • ์š”์†Œ ๋˜๋Š” ๋ฐ˜๋ณต ์ˆ˜์ •์ธ์ง€ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค( map ๋Œ€ filter / skip ).

  4. ์†์„ฑ ์ˆ˜์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ˆ ์–ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„(์˜ˆ: filter_map

    • ๋Œ€๋žต apply modifier_1 and then apply modifier_2 ์˜ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๊ณ  ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ƒ์„ฑ/์†Œ๋น„ ์ˆ ์–ด์™€ ์ˆ˜์ • ์ˆ ์–ด๋ฅผ ๊ฒฐํ•ฉํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„(์˜ˆ: drain_filter )

    • _ํ•˜์ง€๋งŒ_ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ˆ˜์ •์ž์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๊ฑฐ๋‚˜ ๋œ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค(์˜ˆ: drain_where ).

๋‹น์‹ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  1. ์ƒ์„ฑ/์†Œ๋น„ ์ˆ ์–ด ์ค‘ ๋‘ ๊ฐ€์ง€๊ฐ€ ํ•˜๋‚˜์˜ ์ด๋ฆ„์œผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‰ฝ๊ฒŒ ํ˜ผ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์— 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

  1. ์—ฌ๊ธฐ์„œ๋Š” Iterator๊ฐ€ ์•„๋‹Œ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. map, filter, filter_map, skip, take_while ๋“ฑ์€ ๋ชจ๋‘ Iterator์˜ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค. Btw, *_where ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?
    ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” retain() , drain() ์™€ ๊ฐ™์ด ์ปฌ๋ ‰์…˜์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ์™€ ๋ช…๋ช… ์ฒด๊ณ„๋ฅผ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐ˜๋ณต์ž๋ฅผ ๋‹ค๋ฅธ ๋ฐ˜๋ณต์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” Iterator ๋ฉ”์„œ๋“œ์—๋Š” ํ˜ผ๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
  2. AFAIK ํ•ฉ์˜๋Š” 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

  1. ์—ฌ๊ธฐ์„œ๋Š” Iterator๊ฐ€ ์•„๋‹Œ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    map, filter, filter_map, skip, take_while ๋“ฑ์€ ๋ชจ๋‘ Iterator์˜ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.
    Btw, *_where๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?
    ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋ช…๋ช… ์ฒด๊ณ„๋ฅผ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด, ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์ง€(), ๋ฐฐ์ˆ˜(). ์™€ ํ˜ผ๋™์ด ์—†๋‹ค.
    ๋ฐ˜๋ณต์ž๋ฅผ ๋‹ค๋ฅธ ๋ฐ˜๋ณต์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ˜๋ณต์ž ๋ฉ”์„œ๋“œ.
  2. 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 ์˜ ๋™์ž‘์€
์ˆ ์–ด ๊ณตํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋งค์šฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

  1. ๋“œ๋กญ ์‹œ ํŒจ๋‹‰ ์ƒํƒœ๊ฐ€ ๋œ ํด๋กœ์ €๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    ํ์‡„๊ฐ€ ๋‹ค์‹œ ํŒจ๋‹‰์„ ์ผ์œผํ‚ค๋ฉด ํƒ‘์Šน์„ ์ผ์œผํ‚ค๊ณ  ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€
    ์˜ค๋ฅ˜ ์ปค๋„ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ž‘์—…์— ์ฐธ์—ฌํ•˜๋Š” ๋ชจ๋“  ํŒจ๋‹‰๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
    ์Šน์„ ์œผ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์€ ์•„์ฃผ ๋‚˜์˜๋‹ค
  2. ์ž ์žฌ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๊ฐ’์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ณ„์† ๋ฐฐ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    ์ด๋ฏธ ๋“œ๋กญ๋œ ํ•˜๋‚˜์˜ ๊ฐ’์„ ํฌํ•จํ•˜์—ฌ ์ž ์žฌ์ ์œผ๋กœ ๋ฌด๋ฃŒ ์ดํ›„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋™์ž‘์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
play.rust-lang.org

2. ์š”์ ์€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ์š”์  ์ž์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
DrainFilter ์˜ ํ–‰๋™์„ ์žฌ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ์™„๋ฃŒ
์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฐ˜๋ณต์ž๋Š” ๋…น์— ๊ฒŒ์œผ๋ฅด๋ฉฐ, ์‚ญ์ œํ•  ๋•Œ ๋ฐ˜๋ณต์ž๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
    ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ์—์„œ ํŒŒ์ƒ
  • drain_filter ์— ์ „๋‹ฌ๋œ ์ˆ ์–ด๋Š” ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ ํŒจ๋‹‰ ์ƒํƒœ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ž ๊ธˆ
    ์ค‘๋…๋จ) ์ด ๊ฒฝ์šฐ ๋“œ๋กญ ๋ฆฌ๋”ฉ ์ค‘์— ํ˜ธ์ถœ๋  ๋•Œ ๋‹ค์‹œ ๋‹นํ™ฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
    ์˜ค๋ฅ˜ ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋งค์šฐ ๋‚˜์ฉ๋‹ˆ๋‹ค.
    ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋งˆ์นจ๋‚ด ์ œ์–ด๋œ ๋ฐฉ์‹์œผ๋กœ ์ข…๋ฃŒํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, ์–ด์จŒ๋“  panic=aboard๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
  • ์ˆ ์–ด์— ๋ถ€์ž‘์šฉ์ด ์žˆ๊ณ  DrainFilter ๋ฅผ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋“œ๋กญ๋  ๋•Œ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋  ๋•Œ ๋†€๋ผ์šด ๋ฒ„๊ทธ(ํ•˜์ง€๋งŒ ์™„๋ฃŒํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋‹ค๋ฅธ ์‚ฌ๋žŒ์€ ๊ทธ๊ฒƒ์„ ํฌ์ธํŠธ๋กœ ๋ฐฐ์ˆ˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋–จ์–ด ๋œจ๋ฆฌ๋Š” ๊ฒƒ ์‚ฌ์ด์—์„œ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)
  • ์ „๋‹ฌ๋œ ์ˆ ์–ด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋Š” ์ด ๋™์ž‘์„ ์˜ตํŠธ์•„์›ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    ๊ทธ๊ฒƒ์„ ํฌ์žฅํ•˜์ง€ ์•Š๊ณ ๋Š” ํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ํ•ญ์ƒ ์‹คํ–‰ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    iterator๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์™„๋ฃŒํ•˜๋ฉด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค(์˜ˆ, ์ด ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋Š” ์•ฝ๊ฐ„
    ํ•ธ๋“œ์›จ์ด๋ธŒ)

์‹คํ–‰ ์™„๋ฃŒ์— ๋Œ€ํ•œ ์ธ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • drain_filter ๋Š” ํ•จ์ˆ˜์ธ ratain ์™€ ๋น„์Šทํ•ด์„œ ์‚ฌ๋žŒ๋“ค์ด
    "๊ทธ๋ƒฅ" DrainFilter ๋ฅผ ์™„๋ฃŒ๊นŒ์ง€ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    • ์ด ์ธ์ˆ˜๋Š” ๋‹ค๋ฅธ RFC์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ฐ•๋˜์—ˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด #[unused_must_use] ์ž…๋‹ˆ๋‹ค.

      ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” ์ด๋ฏธ .for_each(drop) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

      DrainFilter ๊ฐ€ ๋“œ๋กญ์—์„œ ํ•˜๋Š” ์ผ

  • drain_filter ๋Š” ์ข…์ข… ๋ถ€์ž‘์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค.

    • ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด retain ์™€ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.



      • ๊ทธ๋Ÿฌ๋‚˜ &T ์‚ฌ์šฉ ์œ ์ง€ , drain_filter ์‚ฌ์šฉ &mut T



  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค??
  • [EDIT, ADDED LATER, THX @tmccombs ]: 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 ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  1. ํŒจ๋‹‰์— ๋น ์ง„ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ˆ„์ถœํ•˜๊ณ  del ์นด์šดํ„ฐ๋ฅผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.

    • ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ณตํ™ฉ ๊ฐ์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ˆ ์–ด๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— idx๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

    • ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ on drop์ด ๋™์ผํ•œ ์ˆ ์–ด๋กœ ๋‹ค์‹œ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ ๋“œ๋กญ ์‹œ API ์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์•„์ด๋””์–ด์ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ find , any ๋“ฑ์ด ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ–‰๋™ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. next ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ณ  next ์—์„œ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ์„ค์ •์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
  2. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—ฌ์ „ํžˆ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ๋“œ๋กญ ์‹œ ์šฐ๋ฆฌ๋Š” ๋‹นํ™ฉํ•˜์—ฌ ๋ˆ„์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋‚˜๋จธ์ง€ ํ•ญ๋ชฉ ๋˜๋Š” ๋‚˜๋จธ์ง€ ํ•ญ๋ชฉ ๋ชจ๋‘ ์‚ญ์ œ

    1. ์˜ˆ๋ฅผ ๋“ค์–ด Arc๋ฅผ ๋ˆ„์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ถ€์ž‘์šฉ์ด ์žˆ๋Š” ์ƒ๋‹นํžˆ ํฐ ๋ˆ„์ถœ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    2. Arc์™€ Weak์ด ์žˆ์œผ๋ฉด ๋งค์šฐ ๋†€๋ž„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์ผ๋‹จ ๊ตฌํ˜„๋˜๋ฉด 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 ๋“œ๋กญ์—์„œ ํ•„ํ„ฐ๋ง ๋ฐ ๋ฐฐ์ˆ˜๊ฐ€ ๋๊นŒ์ง€ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒฝ์šฐ ํ•ด์ œํ•˜๋Š” ๋™์•ˆ ์ž ์žฌ์ ์ธ ํŒจ๋‹‰ ์‚ฌ์ด์—์„œ ์–ด๋ ค์šด ์„ ํƒ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
์ด ๊ธฐ๋Šฅ์€ ์–ด๋Š ์ชฝ์ด๋“  ๋ฌธ์ œ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •ํ™”๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•ด์ œ ์‹œ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ํŠน๋ณ„ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€๋Šฅ์„ฑ:

  • ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด์ œ ์‹œ ์ผ์น˜ํ•˜๋Š” ์š”์†Œ๋ฅผ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค(๋‚˜๋จธ์ง€ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •๋จ).
  • ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด์ œ ์‹œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ธฐ๋ก๋œ ์œ„์น˜ ๋’ค์—์„œ ๋ฒกํ„ฐ๋ฅผ ์ž๋ฆ…๋‹ˆ๋‹ค(๋‚˜๋จธ์ง€ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •๋จ).
  • ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด์ œ ์‹œ ๋ฒกํ„ฐ๋ฅผ ๊ธธ์ด 0์œผ๋กœ ์ž๋ฆ…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐ˜๋ก ์€ ์ผ๋ฐ˜์ ์œผ๋กœ drain_filter ์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ๋ถˆ๋ณ€์— ์˜์กดํ•˜๋Š” drop ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค(์ฆ‰, ๊ฒฐ๊ตญ vec์˜ ์š”์†Œ๋Š” ์ •ํ™•ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ์‹คํŒจํ•จ)์€ drain_filter ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ(๋Œ€๋ถ€๋ถ„ ์ •์ƒ์ ์ด๊ณ  ์•ˆ์ „ํ•œ ์ฝ”๋“œ)์—์„œ ์ž„์˜๋กœ ๋ฉ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋“  ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์š”์†Œ๋ฅผ ๊ต์ฒดํ•˜๋Š” ๋ช…๋ นํ˜• ๋ฃจํ”„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์กฐ๊ฑด์ด ํŒจ๋‹‰ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  ๋“œ๋กญ impl์ด ํ•„ํ„ฐ ์กฐ๊ฑด์ด false์ธ ๊ฒƒ์— ํฌ๊ฒŒ ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ์—๋Š” ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. drop_filter ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฌธ์„œ๊ฐ€ ์ด ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์— ์ฃผ์˜๋ฅผ ํ™˜๊ธฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋น„๊ตํ•˜๋ฉด ๊ฐœ์„  ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ˜„์žฌ ๊ตฌํ˜„ ์ด ์—ฌ์ „ํžˆ ์š”์†Œ๋ฅผ ์ด์ค‘ ๋“œ๋กญ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์— ๊ฒŒ์‹œ๋œ ์ด ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์˜ˆ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ž˜์„œ ์ด๋Œ€๋กœ๋Š” ์ ˆ๋Œ€ ์•ˆ์ •๋  ์ˆ˜ ์—†๋‹ค!)

๊ฑด์ „์„ฑ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ I-unsound๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๋‹น์‹ ์€ ํ‘œ์‹œ๋ฅผ ํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋”๋ธ” ํŒจ๋‹‰๋งŒํผ ๊ฑด์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค _๊ฑด์ „ํ•ฉ๋‹ˆ๋‹ค_
์ค‘๋‹จ๋  ๋•Œ ๋งค์šฐ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ํ•œ
์ด์ค‘ ํŒจ๋‹‰์˜ ๊ฐ€๋Šฅ์„ฑ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์•”๋ฌต์ ์ธ ํ–‰๋™์ด์ง€๋งŒ
๊ณ ์˜๋กœ ์„ ํƒํ•œ.

์˜ต์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋“œ๋กญ ์‹œ ์™„๋ฃŒ๊นŒ์ง€ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  2. ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•˜์ง€๋งŒ ์ด์ค‘ ํŒจ๋‹‰์œผ๋กœ ์ธํ•ด ์ž ์žฌ์ ์œผ๋กœ ์ค‘๋‹จ๋จ
  3. ํŒจ๋‹‰ ์ค‘์— ๋“œ๋กญ ์‹œ ๋ชจ๋“  "ํ™•์ธ๋˜์ง€ ์•Š์€" ์š”์†Œ๋ฅผ ๋“œ๋กญํ•˜์‹ญ์‹œ์˜ค.
  4. ํŒจ๋‹‰ ์ƒํƒœ์—์„œ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ์™„๋ฃŒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. => ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘.
  2. => ์ˆ ์–ด๊ฐ€ ํŒจ๋‹‰์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ํŠนํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ค‘๋‹จ
    ์š”์†Œ๋ฅผ "๊ทธ๋ƒฅ" ์ œ๊ฑฐํ•˜๋ ค๋ฉด, ์ฆ‰ ๋ฐ˜ํ™˜๋œ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. => ๊ณตํ™ฉ ์ƒํƒœ์— ๋น ์ง€๋Š” ๊ฒƒ๊ณผ ๋ฐ”๊นฅ์— ์žˆ์„ ๋•Œ์˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ฐจ์ด. ๋‹จ์ง€
    drop ํ•จ์ˆ˜์—์„œ drain_filter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
  4. => 3 ์ฐธ์กฐ.

๋˜๋Š” ๋‹ค๋ฅธ ๋ง๋กœ ํ•˜๋ฉด 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์„ ์ฝ๋Š” ๊ฒƒ์ด ์–ด๋ฆฌ์„์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. => ๊ณตํ™ฉ ์ƒํƒœ์— ๋น ์ง€๋Š” ๊ฒƒ๊ณผ ๋ฐ”๊นฅ์— ์žˆ์„ ๋•Œ์˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ฐจ์ด. ๋‹จ์ง€
    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 ์™€ ๊ฐ™์€ ๋‚ด๋ถ€ ์ž‘์—…์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

  1. ๋ฐ˜๋ณต์ž๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ์ œ๊ฑฐ๋œ ํ•ญ๋ชฉ์„ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž‘์—…์„ ์ผ์ฐ ์ค‘๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ œ์ž๋ฆฌ์— ๋‘๋Š” ๋Œ€์‹ (๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋™์•ˆ) ํ•ญ๋ชฉ ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ ๊ฐ’(์›๋ž˜ ๊ฐ’์˜ ๋ณต์ œ๋ณธ ๋˜๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐ’์ผ ์ˆ˜ ์žˆ์Œ)์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
  4. ์ œ๊ฑฐ๋œ ํ•ญ๋ชฉ์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒˆ ํ•ญ๋ชฉ์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
  5. ํ˜„์žฌ ํ•ญ๋ชฉ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋‹ค์Œ ํ•ญ๋ชฉ ์ค‘ ๋ช‡ ๊ฐœ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์ œ์ž๋ฆฌ์— ๋‘์‹ญ์‹œ์˜ค.
  6. ํ˜„์žฌ ํ•ญ๋ชฉ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋จผ์ € ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๊ณ  ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์— ๋Œ€ํ•œ ๋ถ„์„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ˜ธ์ถœ์ž๋Š” ๋ฐ˜๋ณต์ž์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ํ•ญ๋ชฉ์„ ์ด๋ฏธ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•œ ๊ฒƒ์€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Vec ์—์„œ ์ œ๊ฑฐ๋œ ํ›„์—๋งŒ ํ˜ธ์ถœ์ž์—๊ฒŒ ๊ฐ’์„ ์ „๋‹ฌํ•˜์—ฌ ๊ฐ’์„ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ˜๋ณต์ž์˜ ๋ชฉ์ ์„ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์กฐ๊ธฐ์— ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ผ๋ถ€ ๊ฒฝ์šฐ์— ์ž ์žฌ์ ์œผ๋กœ ์ ๊ทผ์  ๋ณต์žก์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API์˜ ์ผ๋ถ€๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๋ฉด ํด๋กœ์ €๊ฐ€ ์บก์ฒ˜๋œ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐ˜๋ณต์ž๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ฐ’์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•๋„ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†Œ๋น„๋˜์—ˆ๋‹ค.
  3. ์ด๊ฒƒ์€ ์‹ค์ œ ์ผ๋ฐ˜์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด๊ฒƒ์€ ์›๋ž˜ "์ฃผ๋ฐฉ ์‹ฑํฌ" ์˜ต์…˜์œผ๋กœ ์ œ์•ˆํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์ด์ง€๋งŒ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์„ ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์œผ๋ฉด Vec ์— ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์›€์ด ๋˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. Vec ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐ˜๋“œ์‹œ ๋” ํšจ์œจ์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ๋” ๋‚˜์  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ์ด๋Š” Vec ๊ฐ€ ํ•ญ๋ชฉ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ํ•ญ๋ชฉ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ƒ˜ํ”Œ ์ฝ”๋“œ์—๋Š” ํฌํ•จํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ณ„์†ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ํ•ญ๋ชฉ ์ค‘ ๋ช‡ ๊ฐœ๋ฅผ ๊ฑด๋„ˆ๋›ธ์ง€ ์ง€์ •ํ•˜๋Š” ์ถ”๊ฐ€ usize ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํด๋กœ์ €๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. ์ด๊ฒƒ์€ ํ•ญ๋ชฉ 5๋ฅผ ๋ณด์™„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ฐ˜๋ณต์ž๋ฅผ ํ†ตํ•ด ์ œ๊ฑฐ๋œ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๋Š” ํ•ญ๋ชฉ์— ์†Œ๋ฉธ์ž๊ฐ€ ์—†๊ณ  ๋‹จ์ˆœํžˆ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•œ ์ตœ์ ํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์œ„์˜ 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๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰