Rust: Vec::drain_filter рдФрд░ LinkedList::drain_filter . рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЬреБрд▓ре░ 2017  ┬╖  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,
    { ... }

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдХрд┐рд╕реА рдмреЗрд╡рдХреВрдл рдиреЗ рдореБрдЭреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреАрди рд▓рд┐рдпрд╛ред рдкреАрдЖрд░ рдЖрд╡рдХред

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

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдХреНрдпрд╛ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдХреЛрдИ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ?

рд╕рднреА 119 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ:
https://github.com/rust-lang/rust/issues/25477
https://github.com/rust-lang/rust/pull/34265

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд░рд╕реЛрдИ рдХреЗ рд╕рд┐рдВрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рд░реЗрдВрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдирд╛рд▓реА рдХреЗ рд╕реБрдкрд░рд╕реЗрдЯ рдХреА рддрд░рд╣ рд╣реЛред рдЙрд╕рдореЗрдВ рдХреЛрдИ рдХрдореА? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реАрдорд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рд╕реАрдорд╛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЦрд╛рдореА рд╣реИ, рдпрд╣ рдПрдХ рдФрд░ рдмрд╛рдд рд╣реИ рдЬреЛ рдШрдмрд░рд╛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди 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); рдЗрдВрдбреЗрдХреНрд╕ 3 рдкрд░ рдЕрдХреНрд╖рд░ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ <10 рд╣реИ .

рджреВрд╕рд░реА рдУрд░ drain_filter рдереЛрдбрд╝рд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ drain рдлрд┐рд░ filter рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рддрд░реАрдХреЗ рд╕реЗ (рдЬреИрд╕реЗ filter_map) рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдирд╛рд▓реА рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдХреЛ рддреБрд▓рдиреАрдп рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ filter рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛,
рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЗрд╕реЗ filtered_drain рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд╣рд▓реЗ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ...

рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрд╣реАрдВ рднреА _where рдпрд╛ _if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред

@Gankro рдХрд╣реАрдВ рднреА _filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ? рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХрдо рдЕрд╕реНрдкрд╖реНрдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ? рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддреНрдпрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ _until рдФрд░ _while ред

рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ "рдХрд╣рд╛ рдЧрдпрд╛ рд╕рдордХрдХреНрд╖" рдХреЛрдб рд╕рд╣реА рдирд╣реАрдВ рд╣реИ ... рдЖрдкрдХреЛ "рдпрд╣рд╛рдБ рдЖрдкрдХрд╛ рдХреЛрдб" рд╕рд╛рдЗрдЯ рдкрд░ i рд╕реЗ рдПрдХ рдХреЛ рдШрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдмреБрд░реА рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВред

рдЖрдИрдПрдордУ рдпрд╣ filter рдирд╣реАрдВ рд╣реИ рдпрд╣ рдореБрджреНрджрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдФрд░ рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ), drain рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЧреИрд░-рдорд╛рдирдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ, рдХреЗрд╡рд▓ рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ, рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЬреЛ рдЪреАрдЬреЗрдВ рдЦреЛрдЬреВрдВрдЧрд╛ рд╡рд╣ delete (рдЬреИрд╕рд╛ рдХрд┐ delete_if ), remove , filter рдпрд╛ reject ред

рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ filter рдХреЗ рд▓рд┐рдП _searched_ рдХрд┐рдпрд╛, 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 рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ?

рд╣рд╛рдВ, рдпрд╣ Iterator рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ, рди рдХрд┐ Vec ред

рдирд╛рд▓реА рдЙрдкрдиреНрдпрд╛рд╕ рд╢рдмреНрджрд╛рд╡рд▓реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрдВрдЧ рдореЗрдВ рдЪреМрдереЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдЕрд░реНрдерд╣реАрди рднреЗрдж рд╣реЛрддрд╛ рд╣реИ (рдЪрд╛рд▓ рд╢рдмреНрджрд╛рд░реНрде рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЛ рдЧрдардмрдВрдзрди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдПрдХ рдПрдХрд▓ ""рдкрд░рдорд╛рдгреБ"" рдСрдкрд░реЗрд╢рди)ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ рдбреНрд░реЗрди рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рдПрдХ рдРрд╕реЗ рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдзреНрдпрд╛рди рджреЗрдВрдЧреА (рдЪреВрдВрдХрд┐ рдмреИрдХрд╢рд┐рдлреНрдЯ рд╕реЗ рдмрдЪрдирд╛ рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ)ред

rust consume vec рдХреЗ Google рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ drain_filter rust consume vec рдорд┐рд▓рд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рдХрд╛рд░рдг, рдлрд╝рд┐рд▓реНрдЯрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдпрд╣ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдореИрдВ рд╕реНрдореГрддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХреВрдВред

drain_where рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЕрд╡рдЧрдд рд╣реИ рдХрд┐ drain рдФрд░ filter рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИред

рдореБрдЭреЗ рдЕрднреА рднреА рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ drain_filter рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд╛рд▓рд┐рдпреЛрдВ (рдпрд╛рдиреА, рдЦрд╛рд▓реА) рдФрд░ рдлрд┐рд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░ drain_where рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рджреА рдЧрдИ рд╢рд░реНрдд рд╣реИ (рдЬреЛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ)ред

рд╡рд┐рдзреЗрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╢реЗрд╖ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП linked_list::DrainFilter рдХреЛ Drop рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╣рд╛рдВ

рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рдЕрдВрдд рддрдХ рдЪрд▓рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдХреНрдпреЛрдВ рдмрдирддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдкрд░ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдХреЗрд╡рд▓ рдЙрддрдиреЗ рд╣реА рддрддреНрд╡реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рддрдирд╛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ mem::forget рдЗрдЯрд░реЗрдЯрд░ рд▓реАрдХ рдкреНрд░рд╡рд░реНрдзрди рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдЙрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП true рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ retain() / retain_mut() рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рддрд┐-рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИред
рдПрдХ рд╕рд╣рдЬ рддрд╛рд░реНрдХрд┐рдХ рд╕реНрддрд░ рдкрд░, рдЙрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП true рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ? (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ retain() рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)
рдРрд╕рд╛ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ, рдФрд░ drain_filter() retain_iter() рдпрд╛ retain_drain() (рдпрд╛ drain_retain() ) рдХрд░ рджреЗрдВ?
рддрдм рдпрд╣ retain() рдФрд░ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рдХрд░реЗрдЧрд╛!

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛
drain_where рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рддрдм рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐:

  1. рдпрд╣ рдирд╛рд▓реА рдХрд╛ рдПрдХ рд░реВрдк рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд╛рдо рдореЗрдВ рдирд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

  2. where рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ drain рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐
    рддрддреНрд╡ _рдХрд╣рд╛рдВ_ рд╡рд┐рдзреЗрдп рд╕рддреНрдп рд╣реИ, рд╕реВрдЦрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

  3. рдпрд╣ рдПрд╕рдЯреАрдбреА рдореЗрдВ рдЕрдиреНрдп рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рдореЗрд▓ рдмрд┐рдард╛рддрд╛ рд╣реИ, рдЖрдо рддреМрд░ рдкрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ a
    рджреЛ рд╡рд┐рдзреЗрдп рд╕реЗ рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЗрд╕рдХрд╛ (рдореЛрдЯреЗ рддреМрд░ рдкрд░) рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
    рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзреЗрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ "рдФрд░ рдлрд┐рд░" рдлреИрд╢рди рдореЗрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
    filter_map рдХрд╛ рдЕрдиреБрдХрд░рдг (рд▓рдЧрднрдЧ) filter an then map рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдж рдХрд░реЗрдВрдЯ
    рдирд╛рдо рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ drain and then filter рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рдХрд░реАрдм рднреА рдирд╣реАрдВ рд╣реИ
    рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╛рд▓реА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕реВрд░реНрдп рдкрд░, 25 рдлрд░рд╡рд░реА, 2018, 17:04 Boscop [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛
рдЙрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд▓реМрдЯреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд▓рдЧрддрд╛ рд╣реИ
рд░рд┐рдЯреЗрди_рдореНрдпреВрдЯ () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрддред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрддрд░ рдкрд░, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ I . рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА
рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ?
рдРрд╕рд╛ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ, рдФрд░ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ () рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рд░рд┐рдЯреЗрди_рдлрд┐рд▓реНрдЯрд░ () рдХрд░реЗрдВ?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/43244#issuecomment-368320990 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AHR0kfwaNvz8YBwCE4BxDkeHgGxLvcWxks5tYYRxgaJpZM4OY1me
.

рд▓реЗрдХрд┐рди drain_where() рдХреЗ рд╕рд╛рде рдХреНрд▓реЛрдЬрд░ рдХреЛ рдЕрднреА рднреА рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ retain() рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЕрд╕рдВрдЧрдд рдмрдирд╛рддрд╛ рд╣реИред
рд╢рд╛рдпрдж retain_where ?
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдирд╛рдо рдореЗрдВ "рдирд╛рд▓реА" рд╣реЛрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ drain_retain() рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдпрд╣ drain() рдЬреИрд╕рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЬрд╣рд╛рдВ рдХреНрд▓реЛрдЬрд░ рд░рд┐рдЯрд░реНрди true ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдХрд┐ рдЖрдкрдХреЛ рд╕рдЪ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐
рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрд╛ рддреЛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:

рдПред drain_where
рдмреАред retain_where
рд╕реАред retain

рдореИрдВ drain_retain рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рдирд╛рд▓реА рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рдПрдХ рд╣реА рддрд░рд╣ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╡рд┐рдкрд░реАрдд рд╕реЗ
рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдирд╛рд▓реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ (рдФрд░ r рд╡рд╛рдкрд╕реА) рдмрд░рдХрд░рд╛рд░ рд░рдЦрддреЗ рд╣реИрдВ
рдЖрдк рдЬреЛ рд░рдЦрддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд▓рддрд╛ рд╣реИ (рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд╕рдЯреАрдбреА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ retaim рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рдореБрдЦ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдПрд╕рдЯреАрдбреА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдХрд┐ рдпрд╣ рддрддреНрд╡реЛрдВ рдХреЛ рддреНрдпрд╛рдЧ рд░рд╣рд╛ рд╣реИ рдЬрдмрдХрд┐ drain рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдмрдирд╛рддрд╛ рд╣реИ
retain (рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ) рдирд╛рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд (рд╕рд┐рд╡рд╛рдп рдЕрдЧрд░ рдЖрдк рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдпрд╣ retain_and_return рдпрд╛ рд╕рдорд╛рди)ред

рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рдЬреЛ рдирд╛рд▓реЗ рдХреА рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдкрд▓рд╛рдпрди рдореЗрдВ рдЖрд╕рд╛рдиреА, рдпрд╛рдиреА рдкрд▓рд╛рдпрди
drain_where рд╢рдмреНрдж рдЖрдзрд╛рд░рд┐рдд рдЦреЛрдЬ рдЪрд▓рд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд╕рдорд╛рди рдЖрд╕рд╛рди рд╣реИ
рдХреЛрдб, рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рддреЗ рд╕рдордп рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд╖реЗрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рд╕рднреА рдкреНрд░рдпреБрдХреНрдд рд╡рд┐рдзреЗрдп/рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ред

рд╕реВрд░реНрдп рдкрд░, 25 рдлрд░рд╡рд░реА, 2018, 18:01 Boscop [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

рд▓реЗрдХрд┐рди рдбреНрд░реЗрди_рд╡реЗрдпрд░ () рдХреЗ рд╕рд╛рде рдХреНрд▓реЛрдЬрд░ рдХреЛ рдЕрднреА рднреА рд╕рдЪ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛
рдРрд╕реЗ рддрддреНрд╡ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ () рдЬреЛ
рдЕрд╕рдВрдЧрдд рдмрдирд╛рддрд╛ рд╣реИ..
рд╢рд╛рдпрдж рдмрдирд╛рдП рд░рдЦреЗрдВ_рдХрд╣рд╛рдВ?
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдирд╛рдо рдореЗрдВ "рдирд╛рд▓реА" рд╣реЛрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ,
рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ drain_retain() рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдпрд╣ рдирд╛рд▓реА рдХреА рддрд░рд╣ рд╣реИ () but
рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЬрд╣рд╛рдВ рдХреНрд▓реЛрдЬрд░ рд╕рд╣реА рд╣реЛрддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/43244#issuecomment-368325374 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AHR0kfG4oZHxGfpOSK8DjXW3_2O1Eo3Rks5tYZHxgaJpZM4OY1me
.

рд▓реЗрдХрд┐рди рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ drain() рд╕реЗ drain_filter() рдкрд░ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реЗрдВрдЧреЗ?
рдЕрдм рддрдХ рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ retain() рд╕реЗ drain_filter() рдкрд░ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрд╕рдЯреАрдбреА рдореЗрдВ рдХреЛрдИ retain_mut() рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рддрддреНрд╡ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рддреЛ рдлрд┐рд░ рдореБрдЭреЗ рдХреНрд▓реЛрдЬрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рдкрд▓рдЯрдирд╛ рдкрдбрд╝рд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ drain_retain() рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ drain() рд╡рд┐рдзрд┐ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕реАрдорд╛ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИ, рдЬрдмрдХрд┐ drain_retain() рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддреА рд╣реИ рдЬрд╣рд╛рдВ рдХреНрд▓реЛрдЬрд░ true рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЬреЛрдбрд╝рддреА рд╣реИ drain() рдФрд░ retain() рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм drain_filter рд╕реЗ drain_where рдкрд░ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдирд╛ рд╣реИред

рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ retain рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдзрд╛рди рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
drain_filter рдПрдХ рдкрд╣рд▓реВ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рд╕реВрд░реНрдп рдкрд░, рдлрд░рд╡рд░реА 25, 2018, 19:12 Boscop [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

рд▓реЗрдХрд┐рди рдЖрдк рдбреНрд░реЗрди () рд╕реЗ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ () рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗ?
рдЕрдм рддрдХ рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рд░рд┐рдЯреЗрди () рд╕реЗ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ () рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд┐рдпрд╛
рдХреНрдпреЛрдВрдХрд┐ рдПрд╕рдЯреАрдбреА рдореЗрдВ рдХреЛрдИ рд░рд┐рдЯреЗрди_рдореНрдпреВрдЯ () рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рддрддреНрд╡ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛!
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ drain_retain () рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдирд╛рд▓реА () рд╡рд┐рдзрд┐ рдирд╛рд▓рд┐рдпреЛрдВ
рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕реАрдорд╛ рдХреЗ рд╕рднреА рддрддреНрд╡, рдЬрдмрдХрд┐ рдбреНрд░реЗрди_рд░рд┐рдЯреЗрди () рдмрд░рдХрд░рд╛рд░ рд░рд╣рддрд╛ рд╣реИ
рд╡реЗ рддрддреНрд╡ рдЬрд╣рд╛рдВ рдХреНрд▓реЛрдЬрд░ рд╕рд╣реА рд╣реЛрддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/43244#issuecomment-368330896 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AHR0kSayIk_fbp5M0RsZW5pYs3hDICQIks5tYaJ0gaJpZM4OY1me
.

рдЖрд╣ рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ drain_filter() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА "рдХреАрдордд" рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдПрд╕рдЯреАрдбреА рдореЗрдВ рдФрд░ рдлрд┐рд░ рд╕реНрдерд┐рд░ рдореЗрдВ рдПрдХ рд╕реБрд╕рдВрдЧрдд рдФрд░ рд╕рд╣рдЬ рдПрдкреАрдЖрдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреА рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рд▓рд╛рдЧрдд рд╣реИ (рдФрд░ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрддрд╛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдмрдВрдж рдХрд░рдирд╛ рдЙрд▓рдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЪреБрдкрдЪрд╛рдк рдПрдХ рдмрдЧ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛) , drain_filter() рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдФрд░ рдлрд┐рд░ retain() рд╕реЗ drain_filter() рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рддреЗ рд╕рдордп рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдмрдВрдж рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ .. (рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдорд╛рдирд╕рд┐рдХ рд▓рд╛рдЧрдд рдХреЗ рд╢реАрд░реНрд╖ рдкрд░) рдРрд╕рд╛ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдвреВрдВрдврдирд╛ рдХрдард┐рди рдмрдирд╛рдиреЗ рдХреА рд▓рд╛рдЧрдд, retain() рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ рдФрд░ " retain() рдЬреИрд╕рд╛ рдХреБрдЫ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП &mut рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирдП рдирд╛рдо рдореЗрдВ рдирд╛рдо "рдмрдирд╛рдП рд░рдЦрдирд╛" рд╣реИ, рддрд╛рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рд▓реЛрдЧ рдЗрд╕реЗ рдвреВрдВрдв рд╕рдХреЗрдВ)ред

рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛: рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ, рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ retain_mut() рдкрд╣рд▓реВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ drain_filter() (рдЕрдХреНрд╕рд░ рд╡реЗ рдкрд╣рд▓реЗ retain() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ), рдореЗрд░реЗ рдкрд╛рд╕ рдХрднреА рднреА рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рд╕реВрдЦреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдо рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рднреА рд╣реЛрдЧрд╛ (рдЪреВрдВрдХрд┐ retain() рдЗрд╕рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП &mut рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ drain_filter() рдХреЛ рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рдкрдбрд╝реЗ , рднреА, рдФрд░ рдпрд╣ рд╕реВрдЦрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ)ред

рдореИрдВ рдлрд┐рд░ рд╕реЗ drain_retain рдХреНрдпреЛрдВ рд╣реВрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдирд╛рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрд╕рдЯреАрдбреА wrt рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдВрдЧреНрд░рд╣:

  1. рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рдзреЗрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ/рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ (wrtред рдЬрдВрдЧ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 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 )

    • _but_ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╛рд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░/рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ (рдЬреИрд╕реЗ drain_where )

рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИ:

  1. рджреЛ рдЙрддреНрдкрд╛рджрдХ/рдЙрдкрднреЛрдХреНрддрд╛ рд╡рд┐рдзреЗрдп рдПрдХ рдирд╛рдо рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдорд╛рд░реЗ рдкрд╛рд╕ take_collect рдЬреИрд╕рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ

drain_retain рдереЛрдбрд╝реЗ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд╢реНрд░реЗрдгреА рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ remove and return all elements "somehow specified" and then keep all elements "somehow specified" discarding other elements рдХрд╣рддрд╛ рд╣реИред


рдПрдХ рддрд░рдл рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ retain_mut рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╢рд╛рдпрдж рдПрдХ рддреНрд╡рд░рд┐рдд рдЖрд░рдПрдлрд╕реА рдЦреЛрд▓рдирд╛ retain_mut рдХреЛ modify + retain рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рдХреБрд╢рд▓ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд░рдирд╛
рд╕реНрдерд┐рд░ рддреЛ рдпрд╣ рд╕рдорд╛рд░реЛрд╣ред рддрдм рддрдХ рдЖрдк рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд┐рдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЖрдк retain_mut рдХреЗ рдорд╛рд▓рд┐рдХ рд╣реИрдВ $# iter_mut + a bool-array (рдпрд╛ bitarray, or...) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рди рддрддреНрд╡реЛрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╛ рдЕрдкрдирд╛ рдЦреБрдж drain_retain рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ drain_filer / drain_where рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рд▓реЗрдХрд┐рди рд╡рд┐рдзреЗрдп рдХреЛ |ele| !predicate(ele) рдирд╣реАрдВ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИред

@dathinab

  1. рд╣рдо рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрдЯрд░реЗрдЯрд░ рдкрд░ рдирд╣реАрдВред рдирдХреНрд╢рд╛, рдлрд╝рд┐рд▓реНрдЯрд░, рдлрд╝рд┐рд▓реНрдЯрд░_рдореИрдк, рдЫреЛрдбрд╝реЗрдВ, рдЯреЗрдХ_рдЬрдмрдХрд┐ рдЗрддреНрдпрд╛рджрд┐ рдЗрдЯрд░реЗрдЯрд░ рдкрд░ рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ *_where рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?
    рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирд╛рдордХрд░рдг рдпреЛрдЬрдирд╛ рдХреА рддреБрд▓рдирд╛ рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░рдиреА рд╣реЛрдЧреА рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдореМрдЬреВрдж рд╣реИрдВ, рдЬреИрд╕реЗ retain() , drain() ред рдЗрдЯрд░реЗрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреНрд░рдо рдирд╣реАрдВ рд╣реИ рдЬреЛ рдПрдХ рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рджреВрд╕рд░реЗ рдЗрдЯрд░реЗрдЯрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
  2. AFAIK рдЖрдо рд╕рд╣рдорддрд┐ рдереА рдХрд┐ retain_mut() рдХреЛ рдПрд╕рдЯреАрдбреА рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ drain_filter() рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рдереАред рдЬреЛ рд╣рдореЗрдВ retain() рд╕реЗ drain_filter() рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдПрдХ рд╕рдорд╛рди рдирд╛рдо рдФрд░ рдПрдкреАрдЖрдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдХреНрд▓реЛрдЬрд░ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ true рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд░рдЦрдирд╛ )..

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ retain_mut рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рд╣реЛ рдЪреБрдХреА рд╣реИред

рд╣рдо рдореБрдЦреНрдп рд░реВрдк рд╕реЗ wrt рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдордХрд░рдг рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкреНрд░рддрд┐
рд╕рдВрдЧреНрд░рд╣, рдЬрд┐рд╕рдореЗрдВ рдЗрдЯрд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдореБрдЦреНрдп рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ
рдЬрдВрдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪ рдХреЗ рддрд░реАрдХреЗ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ
рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ред

  • _where рдкреНрд░рддреНрдпрдп рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ
    рд╕рдорд╛рд░реЛрд╣ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддреНрдпрдп рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрд╕рдЯреАрдбреА рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рд╡реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣реИрдВ
    _until , _while , _then , _else , _mut рдФрд░ _back ред

drain_retain рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╣реИ
рдбреНрд░реЗрди рдпрд╛ рд░рд┐рдЯреЗрди рдмреЗрд╕реНрдб, рдЕрдЧрд░ рдпрд╣ рдбреНрд░реЗрди рдмреЗрд╕реНрдб рд╣реИ, рддреЛ рд░рд┐рдЯрд░реНрди рдЯреНрд░реВ рд╣рдЯрд╛ рджреЗрдЧрд╛
рдореВрд▓реНрдп, рдЕрдЧрд░ рдмрдирд╛рдП рд░рдЦрд╛ рд╣реИ рддреЛ рдпрд╣ рдЗрд╕реЗ рд░рдЦреЗрдЧрд╛ред _where рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдмрдирд╛рддрд╛ рд╣реИ
рдЕрдВрддрд┐рдо рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдкрд╛рд░рд┐рдд рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рдХреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред

рд╕реЛрдо, 26 рдлрд░рд╡рд░реА, 2018 рдХреЛ 00:25 Boscop [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

@dathinab https://github.com/dathinab

  1. рд╣рдо рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрдЯрд░реЗрдЯрд░ рдкрд░ рдирд╣реАрдВред
    рдирдХреНрд╢рд╛, рдлрд╝рд┐рд▓реНрдЯрд░, рдлрд╝рд┐рд▓реНрдЯрд░_рдореИрдк, рдЫреЛрдбрд╝реЗрдВ, рдЯреЗрдХ_рдЬрдмрдХрд┐ рдЗрддреНрдпрд╛рджрд┐ рдЗрдЯрд░реЗрдЯрд░ рдкрд░ рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред
    рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ *_рдХрд╣рд╛рдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?
    рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирд╛рдордХрд░рдг рдпреЛрдЬрдирд╛ рдХреА рддреБрд▓рдирд╛ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдХрд░рдиреА рд╣реЛрдЧреА рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ
    рд╕рдВрдЧреНрд░рд╣ рдкрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рд░рдЦреЗрдВ (), рдирд╛рд▓реА ()ред рдЗрд╕рдореЗрдВ рдХреЛрдИ рднреНрд░рдо рдирд╣реАрдВ рд╣реИ
    рдЗрдЯрд░реЗрдЯрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬреЛ рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рджреВрд╕рд░реЗ рдЗрдЯрд░реЗрдЯрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИрдВред
  2. AFAIK рдЖрдо рд╕рд╣рдорддрд┐ рдереА рдХрд┐ рд░рд┐рдЯреЗрди_рдореНрдпреВрдЯ () рдХреЛ рдПрд╕рдЯреАрдбреА рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛
    рдХреНрдпреЛрдВрдХрд┐ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ () рдкрд╣рд▓реЗ рд╣реА рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рдереА
    рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЬреЛ рд╣рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рддрд╛ рд╣реИ
    рд░рд┐рдЯреЗрди () рд╕реЗ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ () рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ a . рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
    рд╕рдорд╛рди рдирд╛рдо рдФрд░ рдПрдкреАрдЖрдИ (рд╕рдЪ рд▓реМрдЯрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд░рдЦрдирд╛) ..

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/43244#issuecomment-368355110 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AHR0kfkRAZ5OtLFZ-SciAmjHDEXdgp-0ks5tYevegaJpZM4OY1me
.

рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдЙрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╡рд╛рдкрд╕реА рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ ()/retain_mut () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рддрд┐-рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ retain рдпрд╣рд╛рдВ рдХрд╛рдЙрдВрдЯрд░-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдирд╛рдо рд╣реИред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЦреБрдж рдХреЛ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ retain рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдЙрд╕ рддрд░реНрдХ рдХреЛ рдЙрд▓рдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди retain() рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╣реЛрдЧрд╛.. рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЛ рдЗрд╕рдХреА рдЖрджрдд рд╣реЛ рдЧрдИ рд╣реИ..

@ рдмреЙрд╕реНрдХреЛрдк : рдФрд░ рдРрд╕рд╛ рд╣реА drain рд╣реИ рдЬреЛ retain рдХрд╛ рд╡рд┐рд▓реЛрдо рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдЯрд╛рдП рдЧрдП рддрддреНрд╡реЛрдВ рдФрд░ рдкреНрд░рддреНрдпрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ _until , _while рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдирд╛рд▓реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:

_ "рдХрд┐рд╕реА рддрд░рд╣" рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рдПрдВ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ, рдЕрдиреНрдп рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд░рдЦреЗрдВ_
рдЬрд╣рд╛рдВ _"рдХрд┐рд╕реА рддрд░рд╣"_ _"рдХрд╛рдЯрдиреЗ рд╕реЗ"_ рд╕рднреА рд╕реНрд▓рд╛рдЗрд╕ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП _"рд╕рднреА"_ рд╣реИред

рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг _рд╡рд╣реА_ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐
_"рдХрд┐рд╕реА рддрд░рд╣"_ is _" рдЬрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд┐рдзреЗрдп рд╕рддреНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ"_ред

рдПрдХ рддрд░рдл рдЬреЛ рд╡рд┐рд╡рд░рдг рдореИрдВ рдмрд░рдХрд░рд╛рд░ рд░рдЦреВрдВрдЧрд╛ рд╡рд╣ рд╣реИ:
_рдХреЗрд╡рд▓ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдВ (рдЕрд░реНрдерд╛рдд рд░рдЦреЗрдВ) рдЬрд╣рд╛рдВ рдПрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд┐рдзреЗрдп рд╕рддреНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдмрд╛рдХреА рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ_

(рд╣рд╛рдВ, рд░рд┐рдЯреЗрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдмрд╛рдХреА рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛, рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛)


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рдЕрдЧрд░ retain рд╣реЛрддрд╛
рд╡рд┐рдзреЗрдп рдореЗрдВ &mut T рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рд╢рд╛рдпрдж рд╣рдЯрд╛рдП рдЧрдП рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдПред
рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ retain рдПрдХ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рдирд╛рдо рдЖрдзрд╛рд░ рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ drain_filter / drain_retain рдЙрдк-рдЗрд╖реНрдЯрддрдо рд╣реИрдВ
рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдзреЗрдп рдХреЛ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд░рдЦрдиреЗ/рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА/рдЧрд▓рдд рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
(рдирд╛рд▓реА рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╕рддреНрдп рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╕рдордп рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд▓рддрд╛ рд╣реИ
рдФрд░ рдкреАрдЫреЗ рд╣рдЯрдирд╛ рдмреЛрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди рддрддреНрд╡реЛрдВ рдХреЛ рд░рдЦрдирд╛ рд╣реИ, рдЕрдВрдд рдореЗрдВ рдЬрдВрдЧ рдореЗрдВ)


рдЕрдВрдд рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдирд╛рдо рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдП рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдорддрджрд╛рди рдХрд░рдирд╛ рдФрд░/рдпрд╛ рднрд╛рд╖рд╛ рдЯреАрдо рдХреЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рджреЗрдирд╛, рд╕реЛрдЪ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ drain_where , drain_if , рдпрд╛ drain_when рдЬреИрд╕рд╛ рдХреБрдЫ drain_filter рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИред

@tmccombs рдЙрди 3 рдореЗрдВ рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ drain_where рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред (рдХреНрдпреЛрдВрдХрд┐ if рдХрд╛ рдЕрд░реНрде рд╣реИ either do the whole thing (in this case draining) or not рдФрд░ when рдЕрд╕реНрдерд╛рдпреА рд╣реИред)
drain_filter рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ drain_where ( рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП true ) рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рддрдереНрдп рдХреЛ рдирд╛рдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ / рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ рдХреНрд▓реЛрдЬрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдЧрд▓рдд рдЕрд░реНрде рдХреА рдЧрд▓рддреА рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдоред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдЗрд╕ рд╕реВрддреНрд░ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢:

  • рдХреНрдпрд╛ R: RangeArgument рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
  • рдХреНрдпрд╛ рдмреВрд▓рд┐рдпрди рдорд╛рди рдЙрд▓рдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рддрд░реНрдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдХреЙрд▓рдмреИрдХ рд╕реЗ true рд▓реМрдЯрдиреЗ рд╕реЗ рдЙрд╕ рдЖрдЗрдЯрдо рдХреЛ рдЗрдЯрд░реЗрдЯрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)
  • рдирд╛рдордХрд░рдгред (рдореБрдЭреЗ drain_where рдкрд╕рдВрдж рд╣реИред)

@ рдЧреИрдВрдХреНрд░реЛ , рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ?

libs рдЯреАрдо рдиреЗ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдЗрд╕ рд╕рдордп рдЕрдзрд┐рдХ drain рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереАред (рдореМрдЬреВрджрд╛ drain_filter рд╡рд┐рдзрд┐ рдирд╛рдЗрдЯрд▓реА рдореЗрдВ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣ рд╕рдХрддреА рд╣реИред) https://github.com/rust-lang/rfcs/pull/2369 рдПрдХ рдФрд░ рдирд╛рд▓реА рдЬреИрд╕рд╛ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЧрд┐рд░рд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдЗрд╕рдХреЗ рдЕрдВрдд рддрдХ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд)ред

рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдореЗрдВ рдЬрд▓ рдирд┐рдХрд╛рд╕реА рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдПрдХ рдЙрдк-рд╢реНрд░реЗрдгреА ( RangeArgument рдЙрд░реНрдл RangeBounds рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдмрдирд╛рдо рд╕рдВрдкреВрд░реНрдг рд╕рдВрдЧреНрд░рд╣ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ .. рдкрд╛рд╕ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, RangeFull рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди )
  • рд╕рдм рдХреБрдЫ рдирд┐рдХрд╛рд▓рдирд╛ (рд╕рдВрднрд╡рддрдГ рдЙрд╕ рд╕реАрдорд╛ рдХреЗ рднреАрддрд░) рдмрдирд╛рдо рдХреЗрд╡рд▓ рддрддреНрд╡ рдЬреЛ рдПрдХ рдмреВрд▓рд┐рдпрди рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ
  • рдбреНрд░реЙрдк рдмрдирд╛рдо рдиреЙрдЯ рдкрд░ рд╕реЗрд▓реНрдл-рдердХрд╛рдК (рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдмрд╛рдХреА рддрддреНрд╡реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░)ред

рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп, рдпрд╛ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдмрдирд╛рдХрд░ рдПрдХ рд╡рд┐рдзрд┐ "рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ" рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдПрдХ рдмрд╛рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ drain рд╡рд┐рдзрд┐ рд╕реНрдерд┐рд░ рд╣реИред рдЗрд╕реЗ рд╕рдВрднрд╡рддрдГ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкрд┐рдЫрдбрд╝реЗ-рд╕рдВрдЧрдд рддрд░реАрдХреЛрдВ рд╕реЗред

рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдореЗрдВ рдЬрд▓ рдирд┐рдХрд╛рд╕реА рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

рдЯреАрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдпреЛрдЧ рдХреЛ рдХреИрд╕реЗ рдФрд░ рдХрд╣рд╛рдБ рджреЗрдЦрддреА рд╣реИ?

рдХреИрд╕реЗ: рдПрдХ рдареЛрд╕ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рд╛рде рдЖрдУ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░реЗрдВ, рд╕рдВрднрд╡рддрдГ рдПрдХ рдкреНрд░реВрдл-рдСрдл-рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде (рдЬрд┐рд╕реЗ рдХрдо рд╕реЗ рдХрдо Vec::as_mut_ptr рдФрд░ Vec::set_len рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЗрдбрд╝ рд╕реЗ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЬрд╣рд╛рдВ рдЬреНрдпрд╛рджрд╛ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ред https://internals.rust-lang.org/c/libs рдореЗрдВ рдПрдХ рдирдпрд╛ RFC рдпрд╛ рдереНрд░реЗрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред

рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЕрдЧрд▓реЗ рджрд┐рдиреЛрдВ рдореЗрдВ рдЗрдВрдЯрд░реНрдирд▓ рдкрд░ рдПрдХ рд╕реВрддреНрд░ рдЦреЛрд▓реВрдВрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдкреАрдЖрдИ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:

    v.drain(a..b).where(pred)

рддреЛ рдпрд╣ рдПрдХ рдмрд┐рд▓реНрдбрд░-рд╕реНрдЯрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рд╣реИ: рдпрджрд┐ .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_where рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рд╣реИ, рддрд╛рдХрд┐ рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП .drain(..).filter() ред

(рдЬреИрд╕рд╛ рдХрд┐ рдЬреЛрдВрд╣реВ рдиреЗ рдКрдкрд░ рдХрд╣рд╛:)

рдЗрд╕ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдирд╛рдордХрд░рдг рдбреНрд░реЗрди_рд╡реЗрдпрд░ рдХреЗ рдмрдЬрд╛рдп рдХрд░рдиреЗ рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рддрд░реНрдХ рдерд╛? рдореЗрд░реЗ рд▓рд┐рдП, рдкреВрд░реНрд╡ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдкреВрд░реЗ рд╡реАрдИрд╕реА рдХреЛ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВ (рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рджреЗрдЦрд╛, рддреЛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛: "рдпрд╣ рдХреИрд╕реЗ рдирд╣реАрдВ рд╣реИред рдирд╛рд▓реА (..)ред рдлрд╝рд┐рд▓реНрдЯрд░ () ?")ред рджреВрд╕рд░реА рдУрд░ рдкреВрд░реНрд╡ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреБрдЫ рд╢рд░реНрдд рд╣реЛрддреА рд╣реИред

рдореИрдВрдиреЗ рдЖрдВрддрд░рд┐рдХ рдкрд░ рдПрдХ рд╕реВрддреНрд░ рдЦреЛрд▓рд╛ рд╣реИред
TLDR рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рдЖрддреНрдо-рдердХрд╛рд╡рдЯ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХреАрдбрд╝реЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХреИрди рд╣реИ рдФрд░ рд╣рдореЗрдВ RangeBounds рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде drain_filter рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рддрдХ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╡рд╣рд╛рдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рди рд╣реЛред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░ рджрд┐рдпрд╛ рд╣реИ: рдбреНрд░реЗрди рдкреНрд░рдпреЛрдЧ
рдирд╛рд▓реА рдФрд░ рд╕рдорд╛рд╢реЛрдзрди рдмреЗрдВрдЪ рдФрд░ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рднреА рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЪреВрдХ рдЧрдПред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреБрд░рд╛рдирд╛ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреБрдЫ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХреЙрдкреА рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛрдЧреА рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ DoubleEndedIterator рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред

@Emerentius рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо drain_filter рд╕реЗ drain_where рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рдХреЛ true рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛!

@ рдмреЙрд╕реНрдХреЛрдк рджреЛрдиреЛрдВ true => рдЙрдкрдЬ рдХреА рд╕рдорд╛рди 'рдзреНрд░реБрд╡реАрдпрддрд╛' рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ drain_filter рдпрд╛ drain_where рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

@ рдкреЛрдкреЛрдЧ рдХреНрдпрд╛ рдЖрдк рдорддрднреЗрджреЛрдВ рдФрд░ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдзрд╛рдЧреЗ рдкрд░ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ DoubleEndedIterator рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╢реВрдиреНрдп рдпрд╛ рдирд┐рдореНрди рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)ред

рдХреИрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ drain_or_retain ? рдпрд╣ рдПрдХ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрдердХ рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХреЛ рдХрд░рддреА рд╣реИред

@askeksa рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ true рд▓реМрдЯрдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ "рдирд╛рд▓реА" рдпрд╛ "рдмрдирд╛рдП рд░рдЦрдирд╛"ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рдирд╛рдо рдХреЗ рд╕рд╛рде drain_where , рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ true рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬреЛ рддрддреНрд╡ рд╕реВрдЦрд╛ рдирд╣реАрдВ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдмрд░рдХрд░рд╛рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдирд╛рд▓реА рдХреЛ рд╕реАрдорд┐рдд/рд░реЛрдХрдиреЗ/рд░рджреНрдж рдХрд░рдиреЗ/рдирд┐рд░рд╕реНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛ рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ рдкрд╣рд▓реЗ N рд╕рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ vec.drain_filter(|x| *x % 2 == 0).take(N).collect() (рдпрд╛ рдЙрд╕ рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░) рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, DrainFilter рдХреА drop рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдирд╛рд▓реА рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдПрдЧреА; рдЗрд╕реЗ рдирд┐рд░рд╕реНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреЛрдИ рддрд░рдХреАрдм рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ рдЬреЛ рдРрд╕рд╛ рдХрд░реЗрдЧреА)ред

рдпрджрд┐ рдЖрдк рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдРрд╕реЗ рд░рд╛рдЬреНрдп рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рддрдиреЗ рджреЗрдЦреЗ рд╣реИрдВ рдФрд░ рдЭреВрдареА рд╡рд╛рдкрд╕реА рд╢реБрд░реВ рдХрд░ рджреА рд╣реИред рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдпрдереЛрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░реЙрдк рдкрд░ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ drain_filter рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЦрддрд░рд╛ wrtред рдЖрд░рд╛рдо + рд╕реБрд░рдХреНрд╖рд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЧрд░реНрднрдкрд╛рдд рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рджреЛрдиреЛрдВ
рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдПрд╕рдЯреАрдбреА рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╕рдордп рдореИрдВрдиреЗ рдЧреМрд░ рдХрд┐рдпрд╛рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ Vec рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди drain_filer рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрдм
рд╡рд┐рдзреЗрдп рдЖрддрдВрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐:

  1. рдпрд╣ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ рдЬреЛ рдбреНрд░реЙрдк рд╣реЛрдиреЗ рдкрд░ рдШрдмрд░рд╛ рдЧрдпрд╛ рдерд╛
    рдЕрдЧрд░ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИ рддреЛ рдпрд╣ рдПрдХ рд╕рд╡рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛ рдФрд░ рдЬрдмрдХрд┐ рдХреБрдЫ рд▓реЛрдЧ
    рддреНрд░реБрдЯрд┐-рдХрд░реНрдиреЗрд▓ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХрд╛рдореЛрдВ рдкрд░ рд╕рд╡рд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрддрдВрдХ рдХреА рддрд░рд╣
    рдПрдХ рд╕рд╡рд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдХрд╛рдлреА рдмреБрд░рд╛ рд╣реИ
  2. рдпрджрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬрд▓ рдирд┐рдХрд╛рд╕реА рдЬрд╛рд░реА рдирд╣реАрдВ рд░рд╣реЗрдЧреА рддреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдорд╛рди
    рдФрд░ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдлреНрд░реА рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рд╣реИ:
play.rust-lang.org

рдЬрдмрдХрд┐ 2. рдмрд┐рдВрджреБ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рд╕реНрд╡рдпрдВ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП DrainFilter рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдВ
рдбреНрд░реЙрдк рдкрд░, рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рдЗрдЯрд░реЗрдЯрд░ рдЬрдВрдЧ рдореЗрдВ рдЖрд▓рд╕реА рд╣реЛрддреЗ рд╣реИрдВ, рдбреНрд░реЙрдк рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдереЛрдбрд╝реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИ
    рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди
  • drain_filter рдХреЛ рдкрд╛рд░рд┐рдд рд╡рд┐рдзреЗрдп рдХреБрдЫ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдШрдмрд░рд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд╛
    рдЬрд╣рд░ рд╣реЛ рдЧрдпрд╛) рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбреНрд░реЙрдк рд▓реАрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рдШрдмрд░рд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ
    рдПрдХ рджреЛрд╣рд░реЗ рдЖрддрдВрдХ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рд╡рд╛рд░, рдЬреЛ рддреНрд░реБрдЯрд┐ рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдлреА рдмреБрд░рд╛ рд╣реИ
    рдкреИрдЯрд░реНрди рдпрд╛ рдЕрдВрдд рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдареАрдХ рд╣реИ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрддрдВрдХ = рд╕рд╡рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
  • рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рдзреЗрдп рдореЗрдВ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реИрдВ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП DrainFilter рдирд╣реАрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ
    рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдмрдЧ рдЬрдм рдЗрд╕реЗ рдЧрд┐рд░рд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдХрд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
    рджреВрд╕рд░рд╛ рдЗрд╕реЗ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рдЧрд┐рд░рд╛рдиреЗ рдХреЗ рдмреАрдЪ рд╕реЛрдЪрддрд╛ рд╣реИ)
  • рдЖрдк рдЗрд╕реЗ рджрд┐рдП рдЧрдП рд╡рд┐рдзреЗрдп рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк
    рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд▓рдкреЗрдЯреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗрдВ, рджреВрд╕рд░реА рдУрд░ рдЖрдк рд╣рдореЗрд╢рд╛ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯ-рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
    рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣рд╛рдБ рдпрд╣ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реИ)
    рд╣рд╛рде рдореЗрдВ рд▓рд╣рд░рджрд╛рд░)

рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рдиреЗ рдХреЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • drain_filter ratain $ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЛрдЧ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ
    "рдмрд╕" рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп DrainFilter рдбреНрд░реЙрдк рдХрд░реЗрдВ

    • рдЗрд╕ рддрд░реНрдХ рдХрд╛ рдЕрдиреНрдп RFC рдореЗрдВ рдХрдИ рдмрд╛рд░ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ #[unused_must_use]

      рдореМрдЬреВрдж рд╣реИ, рдЬреЛ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА .for_each(drop) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдбрдВрдмрдирд╛ рд╣реИ

      рд╡рд╣реА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ DrainFilter рдбреНрд░реЙрдк рдкрд░ рдХрд░рддрд╛ рд╣реИ

  • drain_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ

    • рдЗрд╕рдХрд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд▓рдЧрднрдЧ retain . рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ



      • рд▓реЗрдХрд┐рди &T рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдирд╛рдП рд░рдЦреЗрдВ, рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ &mut T



  • рдЕрдиреНрдп??
  • [рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, THX @tmccombs ]: find , all , any рдЬреИрд╕реЗ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рдбреНрд░реЙрдк рдкрд░ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдореИрдВ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реВрдВ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд╕рд┐рд░реНрдл рдореИрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдореИрдВ рдХреБрдЫ рдмрд┐рдВрджреБ рдЪреВрдХ рдЧрдпрд╛ рд▓реЗрдХрд┐рди Drop рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реВрдВ рдФрд░
#[unused_must_use] рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ?

рдЕрдЧрд░ .for_each(drop) рд▓рдВрдмрд╛ рд╣реИ рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрдЯрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░рдПрдлрд╕реА рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЗрдЯрд░реЗрдЯрд░ (рдпрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ drain() рд▓реЗрдХрд┐рди рдпрд╣ complete() рдЬреИрд╕реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реИ
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рд╣реИ)

рдЕрдиреНрдп??

рдореБрдЭреЗ рдореВрд▓ рддрд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ DrainFilter рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рднреА рдХреБрдЫ рд╕рдорд╕реНрдпрд╛ рдереА рдЬреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рднреА рджреЗрдЦреЗрдВ https://github.com/rust-lang/rust/issues/43244#issuecomment -394405057

рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП find рдХреЗ рдХрд╛рд░рдг рдирд╛рд▓рд╛ рддрдм рддрдХ рдмрд╣реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рд╣рд┐рдЯ рди рд╣реЛ рдЬрд╛рдП
рдореИрдЪ, рд╕рдорд╛рди all , any рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд╛рдлреА рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд░рд┐рдЯ рдирд╛рд▓реАред

рд╣рдореНрдо, рд╢рд╛рдпрдж рдореБрдЭреЗ рдЕрдкрдиреА рд░рд╛рдп рдмрджрд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ
рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рд╡рд╛рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдФрд░ рд╢рд╛рдпрдж рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
(рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░) рдПрдХ .allways_complete() рдПрдбреЗрдкреНрдЯрд░ рдХреА рддрд░рд╣ред

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдирд╛рд▓реА рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдКрдкрд░ рдХреБрдЫ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦреЗ рд╣реИрдВ, next() рдкрд░ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдк-рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ take_while , peekable рдФрд░ skip_while ред

рдпрд╣ рдЧреИрд░-рд╕реЗрд▓реНрдл-рдердХрд╛рдК рдбреНрд░реЗрди рдкрд░ рдореЗрд░реЗ RFC рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рдереА рд╕реЗрд▓реНрдл- рдПрдХреНрд╕рд╣реЙрд╕реНрдЯрд┐рдВрдЧ рдЗрдЯрд░ рдПрдбреЗрдкреНрдЯрд░ RFC рдХреЗ рд╕рдорд╛рди рдореБрджреНрджреЛрдВ рдХреЛ рднреА рд╕рд╛рдордиреЗ рд▓рд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ drain_filter рдЖрд╕рд╛рдиреА рд╕реЗ рдЧрд░реНрднрдкрд╛рдд рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд╣рд╛рдВ рдХрд░рддрд╛ рд╣реИ?

рд╣рд╛рдБ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд░ рд▓рд┐рдпрд╛: play.rust-lang.org

рдпрд╣ рдХреМрди рд╕рд╛ рд╣реИ:

#![feature(drain_filter)]

use std::panic::catch_unwind;

struct PrintOnDrop {
    id: u8
}

impl Drop for PrintOnDrop {
    fn drop(&mut self) {
        println!("dropped: {}", self.id)
    }
}

fn main() {
    println!("-- start --");
    let _ = catch_unwind(move || {
        let mut a: Vec<_> = [0, 1, 4, 5, 6].iter()
            .map(|&id| PrintOnDrop { id })
            .collect::<Vec<_>>();

        let drain = a.drain_filter(|dc| {
            if dc.id == 4 { panic!("let's say a unwrap went wrong"); }
            dc.id < 4
        });

        drain.for_each(::std::mem::drop);
    });
    println!("-- end --");
    //output:
    // -- start --
    // dropped: 0    <-\
    // dropped: 1       \_ this is a double drop
    // dropped: 0  _  <-/
    // dropped: 5   \------ here 4 got leaked (kind fine)  
    // dropped: 6
    // -- end --

}

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдВрддрд░рд┐рдХ рд╕реЛрдЪ рд╣реИ, рдЬреЛ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ред
рдореВрд▓ рд░реВрдк рд╕реЗ рдЦреБрд▓рд╛ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдзреЗрдп рд╕рдорд╛рд░реЛрд╣ рдХреЗ panic рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ:

  1. рдЙрд╕ рддрддреНрд╡ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдШрдмрд░рд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕реЗ рд▓реАрдХ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдбреЗрд▓ рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛ рджрд┐рдпрд╛

    • рдкреИрдирд┐рдХ рдбрд┐рдЯреЗрдХреНрд╢рди рдХреЗ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

  2. рд╡рд┐рдзреЗрдп рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ idx рдХреЛ рдЖрдЧреЗ рди рдмрдврд╝рд╛рдПрдВ

    • рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреНрд░реЙрдк рдкрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЙрд╕реА рд╡рд┐рдзреЗрдп рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛

рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдбреНрд░реЙрдк рдкрд░ рдПрдкреАрдЖрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ find , any , рдЖрджрд┐ рднреНрд░рдорд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рди рдХрд░реЗрдВред

рд╢рд╛рдпрдж рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  1. next рджрд░реНрдЬ рдХрд░рддреЗ рд╕рдордп рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░реЗрдВ, next . рд╕реЗ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЕрдирд╕реЗрдЯ рдХрд░реЗрдВ
  2. рдбреНрд░реЙрдк рдкрд░ рдЕрдЧрд░ рдЭрдВрдбрд╛ рдЕрднреА рднреА рд╕реЗрдЯ рд╣реИ рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдШрдмрд░рд╛ рдЧрдП рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓реАрдХ рд╣реЛ рдЧрдП рд╣реИрдВ
    рд╢реЗрд╖ рдЖрдЗрдЯрдо рдпрд╛ рд╢реЗрд╖ рд╕рднреА рдЖрдЗрдЯрдо рдЫреЛрдбрд╝ рджреЗрдВ

    1. рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдмрдбрд╝рд╛ рд░рд┐рд╕рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░реНрдХ рд▓реАрдХ рдХрд░рддреЗ рд╣реИрдВ

    2. рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрд░реНрдХ рдФрд░ рд╡реАрдХ рд╣реИ рддреЛ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╢рд╛рдпрдж рдХреЛрдИ рдмреЗрд╣рддрд░ рдЙрдкрд╛рдп рд╣реЛред
рдЬреЛ рднреА рд╣реЛ, рдЙрд╕реЗ рдПрдХ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд░рд╕реНрдЯрдбреЙрдХ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@dathinab

рд╣рд╛рдБ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд┐рдпрд╛ рдерд╛

рд░рд┐рд╕рд╛рд╡ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рд▓реЗрдХрд┐рди рдареАрдХ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рд╕реЗ рдмрдЪрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбрдмрд▓-рдбреНрд░реЙрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИред рдЕрдЪреНрдЫреА рдХреИрдЪ! рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рдХреНрдпрд╛ drain_filter рд╣рд░ рдмрд╛рд░ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдкрд░ рдкреБрди: рдЖрд╡рдВрдЯрди рдХрд░рддрд╛ рд╣реИ? рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреБрди: рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реА ++ рдореЗрдВ std::remove рдФрд░ std::erase (рдЬреЛрдбрд╝реА рдореЗрдВ) рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рдареАрдХ рдПрдХ рдЖрд╡рдВрдЯрди рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛: рд╣рдо рдмрд╕ рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЙрдЪрд┐рдд рдЖрдХрд╛рд░ рдореЗрдВ рд╕рд┐рдХреЛрдбрд╝рддреЗ рд╣реИрдВред

рд╕рд╛рде рд╣реА, try_drain_filter рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? рдЕрдЧрд░ рд╣рдореЗрдВ рд░реБрдХрдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдХреМрди рд╕рд╛ Option рдкреНрд░рдХрд╛рд░, рдФрд░ None рдорд╛рди рджреЗрддрд╛ рд╣реИ? рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╡реНрдпрд░реНрде рд╣реИ рдЬрдм рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣ рдорд┐рд▓ рдЧрдпрд╛ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдХреЛрдб рдкрд░ рд▓рд┐рдпрд╛ рддреЛ рдЙрд╕рдиреЗ рдХреБрдЫ рдРрд╕рд╛ рдХрд┐рдпрд╛: "рдЕрдВрддрд░рд╛рд▓" рдмрдирд╛рдпрд╛
рддрддреНрд╡реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рдФрд░ рдПрдХ рдРрд╕реЗ рддрддреНрд╡ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реВрдЦрд╛ рдирд╣реАрдВ рд╣реИ
рдЕрдВрддрд░рд╛рд▓ рдХреА рд╢реБрд░реБрдЖрдд рдЬрдм рдпрд╣ рдПрдХ рдкрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдЬреЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд (рдпрд╛ рддреЛ рдмрд╛рд╣рд░ рдпрд╛ рд╕рд░рдгреА рдореЗрдВ рдХрд┐рд╕реА рдирдП рд╕реНрдерд╛рди рдкрд░) рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреИрд╕реЗ remove рдпрд╣ рдкреБрди: рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдХреНрдд рднрд╛рдЧ рдмрд╕ рдмрди рдЬрд╛рддрд╛ рд╣реИ
рдЕрдкреНрд░рдпреБрдХреНрдд рдХреНрд╖рдорддрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ред

рд╢реБрдХреНрд░, рдЕрдЧрд╕реНрдд 10, 2018, 07:11 рдкрд░ Victor Polevoy [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

рдХреНрдпрд╛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдпрд╣ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ рддреЛ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ рд░реАрдпрд▓рд▓реЛрдХреЗрд╢рди рдХрд░рддрд╛ рд╣реИ
рд╕рдВрдЧреНрд░рд╣? рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреБрди: рдЖрд╡рдВрдЯрди рдХрд░рддрд╛ рд╣реИ рдФрд░ std::remove . рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдФрд░ рд╕реА++ рдореЗрдВ std::erase (рдЬреЛрдбрд╝реА рдореЗрдВ)? рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐
рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЖрд╡рдВрдЯрди: рд╣рдо рдмрд╕ рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ
рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╣рдЯрд╛рдХрд░ рдЙрдЪрд┐рдд рдЖрдХрд╛рд░ рдореЗрдВ рд╕рд┐рдХреЛрдбрд╝реЗрдВред

рд╕рд╛рде рд╣реА, try_drain_filter рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? рдЬреЛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ, рдФрд░
рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рдЕрдЧрд░ рд╣рдореЗрдВ рд░реБрдХрдирд╛ рдЪрд╛рд╣рд┐рдП? рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдФрд░ рдпрд╣ рд╣реИ
рдореЗрд░реЗ рд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдЬрдм рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/43244#issuecomment-411977001 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AHR0kdOZm4bj6iR9Hj831Qh72d36BxQSks5uPRYNgaJpZM4OY1me
.

@rustonaut рдзрдиреНрдпрд╡рд╛рджред try_drain_filter рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдХреНрдпрд╛ рд░рд╛рдп рд╣реИ? :)

рдкреАрдПрд╕ рдмрд╕ рдХреЛрдб рдХреЛ рднреА рджреЗрдЦрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред

рдпрд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рджреМрд░рд╛рди рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рдЖрдк рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЗрд╕реЗ рдЧрд┐рд░рд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛
рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд┐рд░рд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдЕрдВрдд рддрдХ рдЬрд╛рддрд╛ рд╣реИред
(рдЬреЛ рдбрдмрд▓ рдкреИрдирд┐рдХ рдФрд░ рд╕реНрдЯрдл рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╣реБрдб рдХреЛ рдХрд╛рдлреА рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИ
рдЙрд╕рдХреЗ рдЬреИрд╕рд╛)ред

рддреЛ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдХреЛрд╢рд┐рд╢ рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдЖрдкрдХреЗ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ
рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ред

рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдирд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд░реЛрдХрдирд╛ рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдирд╛ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЬреИрд╕реЗ thing.drain_where(|x| x.is_malformed()).any(|x| x.is_dangerus()) рд╕рднреА рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЦрддреНрдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреА, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ . рддрдХ
рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдЦрддрд░рдирд╛рдХ рднреА рд╣реИред (рдореМрдЬреВрджрд╛ рдЗрдореНрдкреНрд▓ред рд╕рднреА рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ
рдмреВрдВрдж рдкрд░ рдЬрд▓ рдирд┐рдХрд╛рд╕реА рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП)ред

рд╢реБрдХреНрд░, рдЕрдЧрд╕реНрдд 10, 2018 рдХреЛ, 10:52 рд╡рд┐рдХреНрдЯрд░ рдкреЛрд▓рд╡реЙрдп рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@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>

рдирдорд╕реНрддреЗ, рдореИрдВ drain_filter рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП HashMap рдХреА рдЦреЛрдЬ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрдм рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓рд╛ рддреЛ рдореБрдЭреЗ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ред рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рдЪреАрдЬрд╝ рдЗрд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рд░реЛрдХ рд░рд╣реА рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдЦреЛрд▓рдирд╛-рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ?

рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рдЕрдзрд░ рдореЗрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдмрд╣реБрдореБрдЦреА рд╣реЛрдЧрд╛:

fn drain_filter_map<F>(&mut self, f: F) -> DrainFilterMap<T, F> where F: FnMut(T) -> Option<T>

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ drain_filter рдФрд░ map рдХреА рд░рдЪрдирд╛ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдЦреЛрд▓рдирд╛-рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ?

рдпрджрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЬрд▓реНрджреА рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рднреА рдорд┐рд▓рд╛рди рддрддреНрд╡реЛрдВ рдХреЛ рди рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмреАрдЪ рдПрдХ рдХрдард┐рди рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ DrainFilter рдХреА рдЧрд┐рд░рд╛рд╡рдЯ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдЕрдВрдд рддрдХ рдирд┐рдХрд╛рд▓рдиреЗ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рджреМрд░рд╛рди рд╕рдВрднрд╛рд╡рд┐рдд рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рднрд░реА рд╣реБрдИ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЗрд╕реЗ рдЦреЛрд▓рдиреЗ рдкрд░ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ:

  • рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреЗрдВ (рддрд╛рдХрд┐ рд╕рднреА рд╢реЗрд╖ рддрддреНрд╡реЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рди рд╣реЛ)ред
  • рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░ рджреЗрдВ (рддрд╛рдХрд┐ рд╕рднреА рд╢реЗрд╖ рддрддреНрд╡реЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рд╣реЛ)ред
  • рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЦреЛрд▓рдиреЗ рдкрд░ рд▓рдВрдмрд╛рдИ 0 рддрдХ рдЫреЛрдЯрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рддрд┐рд╡рд╛рдж рдЬреЛ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ drop рдХреЛрдб рдЬреЛ рдЖрдорддреМрд░ рдкрд░ drain_filter рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐, рдЕрдВрдд рдореЗрдВ, vec рдореЗрдВ рддрддреНрд╡ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╣реЛрдВрдЧреЗ рдЬреЛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд┐рдлрд▓) рдХреЛрдб рд╕реЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╕рд╛рдорд╛рдиреНрдп, рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб) рдЬреЛ drain_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рдерд╛ред рдпрд╣ рдХреЛрдб рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рдЪрд╛рд╣реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдХреИрд╕реЗ рднреА рд▓рд┐рдЦреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рд╡реЗ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд▓реВрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд░рд┐рд╡рд░реНрд╕ рдФрд░ рд╕реНрд╡реИрдк-рд╣рдЯрд╛рдП рдЧрдП рддрддреНрд╡реЛрдВ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрджрд┐ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдШрдмрд░рд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдбреНрд░реЙрдк рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдмрдЧ рд╣реИред drop_filter рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдиреЗ рд╕реЗ рдЬрд┐рд╕рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЗрд╕ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреБрд▓рдирд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдпрд╣ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рдереНрд░реЗрдб рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреА рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдбрдмрд▓-рдбреНрд░реЙрдк рдХрд░рддрд╛ рд╣реИред (рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!)

рд╕рд╛рдЙрдВрдбрдиреЗрд╕ рдмрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ I-unsound рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдбрдмрд▓ рдкреИрдирд┐рдХ _is sound_ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рд░реНрдХ рдпрд╛ рдЕрдирд╕рд╛рдЙрдВрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдмрд╕ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ
рдбрдмрд▓ рдкреИрдирд┐рдХрд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╣реИ
рдЬрд╛рдирдмреВрдЭрдХрд░ рдЪреБрдирд╛ рдЧрдпрд╛ред

рд╡рд┐рдХрд▓реНрдк рдореВрд▓ рд░реВрдк рд╕реЗ рд╣реИрдВ:

  1. рдбреНрд░реЙрдк рдкрд░ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝реЗрдВ рдирд╣реАрдВред
  2. рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝реЗрдВ рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рджреЛрд╣рд░реЗ рдЖрддрдВрдХ рдХреЗ рдХрд╛рд░рдг рдирд┐рд░рд╕реНрдд рдХрд░реЗрдВ
  3. рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рджреМрд░рд╛рди рд╕рднреА "рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд" рддрддреНрд╡реЛрдВ рдХреЛ рдбреНрд░реЙрдк рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВред
  4. рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рджреМрд░рд╛рди рдбреНрд░реЙрдк рдкрд░ рдкреВрд░рд╛ рди рдХрд░реЗрдВред

рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  1. => рдХрдИ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ред
  2. => рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЧрд░реНрднрдкрд╛рдд рдпрджрд┐ рд╡рд┐рдзреЗрдп рдШрдмрд░рд╛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
    рддрддреНрд╡реЛрдВ рдХреЛ "рдмрд╕" рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛рдиреА рдЖрдк рд▓реМрдЯрд╛рдП рдЧрдП рдЗрдЯрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  3. => рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреЗ рдмреАрдЪ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЕрдВрддрд░ред рдЕрднреА - рдЕрднреА
    рдбреНрд░реЙрдк рдлрдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рд╕реА рдХреЛ _рдЙрдкрдпреЛрдЧ_рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
  4. => 3 рджреЗрдЦреЗрдВред

рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ 1. рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреНрд░рдо рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, 2. рдиреЗрддреГрддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдЧрд░реНрднрдкрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд░ рд╡рд┐рдзреЗрдп рдШрдмрд░рд╛ рд╕рдХрддрд╛ рд╣реИ 3.,4ред рдЗрд╕реЗ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗрдВ
рдЗрд╕реЗ рдПрдХ рдбреНрд░реЙрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рд╡рд╣рд╛рдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?
рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк 3.,4. рдиреЛ-рдЧреЛ рд╣реИрдВред рд╡рд┐рдХрд▓реНрдк 2 рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ
рдЕрдзрд┐рдХ рджреБрд░реНрд▓рдн рддреЛ 1 рдореЗрдВ рд╡рд╛рд▓реЗред рдЗрд╕рд▓рд┐рдП 2 рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред

рдЖрдИрдПрдордПрдЪрдУ рдПрдХ рдирд╛рд▓реА + рдирд╛рд▓реА_рдлрд┐рд▓реНрдЯрд░ рдПрдкреАрдЖрдИ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдЬреЛ рдирд╣реАрдВ рдЪрд▓рддрд╛
рдбреНрд░реЙрдк рдкрд░ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП + рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдЯрд░реЗрдЯрд░ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдЬреЛ рдЪрд▓рддрд╛ рд╣реИ
рдбреНрд░реЙрдк рдкрд░ рдкреВрд░рд╛ рд╣реЛрдирд╛ + рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ рд▓реЗрдХрд┐рди рдмрд╕ рд╕рднреА рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИ
рдмрдЪреА рд╣реБрдИ рд╡рд╕реНрддреБрдПрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирд╛рд▓реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рд╣реИ, рдкреБрдирд░рд╛рд╡рд░реНрддрдХ
рд╕рдВрдпреЛрдЬрдХ рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдФрд░ рдирд╛рд▓реА рдХреЛ рдлреНрдпреВрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдирд╛рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕реЛрдо, 20 рдордИ, 2019, 09:28 рдХреЛ рд░рд╛рд▓реНрдл рдЬрдВрдЧ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рд╕рд╛рдЙрдВрдбрдиреЗрд╕ рдмрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд╡рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдлрд┐рд░ I-unsound рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/43244?email_source=notifications&email_token=AB2HJEL7FS6AA2A2KF5U2S3PWJHK7A5CNFSM4DTDLGPKYY3PNVWWK3TUL52HS4DFVREXG43VMV93RWZ63GOD92 рдореБрджреНрджрд╛
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AB2HJEMHQFRTCH6RCQQ64DTPWJHK7ANCNFSM4DTDLGPA
.

рдбрдмрд▓- рдбреНрд░реЙрдк рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрд╕реНрд╡рд╕реНрде рд╣реИрдВред

рдмреЗрд╣рддрд░реА рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП #60977 рдмрдирд╛рдпрд╛ рдЧрдпрд╛

рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдбрдмрд▓ рдбреНрд░реЙрдк рдХреЛ рдбрдмрд▓ рдкреИрдирд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╡рдХреВрдл рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ: man_facepalming:ред

  1. => рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреЗ рдмреАрдЪ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЕрдВрддрд░ред рдЕрднреА - рдЕрднреА
    рдбреНрд░реЙрдк рдлрдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рд╕реА рдХреЛ _рдЙрдкрдпреЛрдЧ_рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

3.,4. рдЗрд╕реЗ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗрдВ
рдЗрд╕реЗ рдПрдХ рдбреНрд░реЙрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рд╡рд╣рд╛рдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?
рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд░ рдХреЛрдИ рдбреНрд░реЙрдк рдЗрдВрдк рдореЗрдВ drain_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдШрдмрд░рд╛ рд╕рдХрддреА рд╣реИ, рддреЛ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ drain_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдирд╛; рдЗрд╕реА рддрд░рд╣ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ drain_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВ;

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдмрд╣реБрдд рдЬрд▓реНрджреА рдЙрддреНрддрд░ рджрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдм рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдореИрдВ рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

рдареАрдХ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ drop impl рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдХреЛрдб рдЬреЛ $#$ drain_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд░рд╣рд╕реНрдпрдордп рддрд░реАрдХреЗ рд╕реЗ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдЖрд░рд╛рдо рдХреЗ рджреМрд░рд╛рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред (рдпрд╣ 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
        ...
    }
}

рдпрд╣ рдбреНрд░реЙрдк рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЖрд░рд╛рдо рдХреЗ рджреМрд░рд╛рди рдЕрдЪрд╛рдирдХ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреНрд░реЗрдирдлрд┐рд▓реНрдЯрд░ рдХреЗ рднреЛрд▓реЗрдкрди рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рд╕рдореНрдореЛрд╣рдХ рддрд░реНрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдзрд╛рдЧрд╛ рдШрдмрд░рд╛ рд░рд╣рд╛ рд╣реИред

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 рдПрдХ рдорд┐рд╕рд╛рд▓ рдХрд╛рдпрдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЙрди рдЖрдЗрдЯрдореНрд╕ рдХреА рд╢реНрд░реЗрдгреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк _remove_ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред Vec::drain_filter рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк _рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ "рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП" рдЖрдЗрдЯрдо рдХрд┐рд╕ рддрд░рдл рдЬрд╛рддреЗ рд╣реИрдВ

рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХрд┐ рдпрд╣ Iterator::filter рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдЪ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рднреА рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ/рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдЗрд╕реНрддреАрдлрд╛ рджреЗ рджрд┐рдпрд╛ рд╣реИред рдореИрдВ drain_filter рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдорд╛рдирддрд╛ред


рдХрд╛рд╢ рд╣рдордиреЗ рд░реВрдмреА рдХреА select рдФрд░ reject рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рдЪреБрдирд╛ рд╣реЛрддрд╛, рд▓реЗрдХрд┐рди рд╡рд╣ рдЬрд╣рд╛рдЬ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд░рд╡рд╛рдирд╛ рд╣реБрдЖ рд╣реИред

рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐? рдХреНрдпрд╛ рдирд╛рдо рд╣реА рдПрдХрдорд╛рддреНрд░ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ рдЕрднреА рднреА рдЕрдзрд░ рдореЗрдВ рд╣реИ?

рдХреНрдпрд╛ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдХреЛрдИ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ DrainFilter рдХрд╛ Drop impl рдпрджрд┐ рдЙрдирдХреЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдиреЗ рд╡рд┐рдзреЗрдп рдЖрддрдВрдХ рд╕реЗ рдШрдмрд░рд╛рдпрд╛ рддреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реАрдХ рдХрд░ рджреЗрдЧрд╛ред рдпрд╣ https://github.com/rust-lang/rust/issues/52267 рдХрд╛ рдореВрд▓ рдХрд╛рд░рдг рд╣реИред рдХреНрдпрд╛ рд╣рдореЗрдВ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ https://github.com/rust-lang/rust/pull/61224 рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ рднреА рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╕реНрдерд┐рд░ рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ :D рдХреНрдпрд╛ рдХреЛрдИ рдЕрд╡рд░реЛрдзрдХ рд╣реИрдВ?

рд╕реАрд╕реА @ рдбрд╛рдпрд▓рди-рдбреАрдкреАрд╕реА

рдХреНрдпрд╛ рдХрднреА рдХреЛрдИ рдирд┐рд░реНрдгрдп drain_filter рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдпрд╛ рдЙрд╕рдХреЗ рд╡рд┐рд░реБрджреНрдз RangeBounds рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреИрд╕реЗ drain рдХрд░рддрд╛ рд╣реИ? рдЬрдм рдЖрдк рд╕рдВрдкреВрд░реНрдг рд╡реЗрдХреНрдЯрд░ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ .. рдкрд╛рд╕ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдмрд╣реБрдореБрдЦреА рд╣реЛрдЧрд╛:

fn drain_filter_map<F>(&mut self, f: F) -> DrainFilterMap<T, F> where F: FnMut(T) -> Option<T>

рд▓рдЧрднрдЧ, рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ FnMut(T) -> Option<U> рд▓рдЧреЗрдЧрд╛, рдЬреИрд╕реЗ Iterator::{filter_map, find_map, map_while} рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ filter_map рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣рд╛рдВ рдЗрд╕рд▓рд┐рдП рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХрдореЛрдмреЗрд╢ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ рдЬреИрд╕реЗ @jethrogb рдиреЗ рдКрдкрд░ рд╕реБрдЭрд╛рдИ рдЧрдИ рд╡рд┐рдзрд┐:

fn drain_filter_map<F>(&mut self, f: F) -> DrainFilterMap<T, F>
    where F: FnMut(T) -> Option<T>

рдореЗрд░реЗ рдорди рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдерд╛ (рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ update рдХрд╣ рд░рд╣рд╛ рдерд╛) рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдбреНрд░реЗрдирд┐рдВрдЧ рдЗрдЯрд░реЗрдЯрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕реБрдзрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдПрдХ рдПрдХрд▓, рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдзрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рдЖрдЗрдЯрдо рдХреЛ рдЬрдЧрд╣ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ, рдореМрдЬреВрджрд╛ рдЖрдЗрдЯрдо рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдХреЙрд▓рд░ рддрдХ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рд▓рдЧрднрдЧ, рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ FnMut(T) -> Option<U> рд▓рдЧреЗрдЧрд╛, рдЬреИрд╕реЗ Iterator::{filter_map, find_map, map_while} рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ filter_map рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреЛ Option<T> рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд╛рджрд┐рдд рдорд╛рди Vec<T> рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред

@ johnw42 рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпрд╛ Some рдореВрд▓реНрдп рддреБрд░рдВрдд рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рдЕрднреА рднреА &T рдпрд╛ &mut T рдХреЗ рдмрдЬрд╛рдп 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 рдХреА рдмрд╛рдд рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдПрдкреАрдЖрдИ рд╣реИрдВ - рд╡реЗ рдирд╣реАрдВ рд╣реИрдВ - рд▓реЗрдХрд┐рди рд╡реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЕрднреНрдпрд╛рд╕, рдФрд░ рдЬрд┐рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪрд╛рд▓реЛрдВ (рдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

drain рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдЪреНрдЫреЗ рдЧреБрдг рдорд┐рд▓рддреЗ рд╣реИрдВ:

  • рддрддреНрд╡реЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдиреНрдирд┐рд╣рд┐рдд рдЪрдпрди рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рд▓реМрдЯрд╛рдП рдЧрдП рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдЫреЛрдбрд╝рдирд╛ред
  • рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдЧрд┐рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЪреБрди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред
  • Vec рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ Copy рдпрд╛ Clone рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • Vec рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдпрд╛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • Vec рдореЗрдВ рдмрдЪреЗ рдорд╛рдиреЛрдВ рдХреЛ рдЕрдзрд┐рдХрддрдо рдПрдХ рдмрд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

drain_filter рдХреЗ рд╕рд╛рде, рдЖрдк Vec рд╕реЗ рдЖрдЗрдЯрдореЛрдВ рдХреЗ рдордирдорд╛рдиреЗ рд╕реЗрдЯ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕рдиреНрдирд┐рд╣рд┐рдд рд╢реНрд░реЗрдгреА рд╕реЗред рдПрдХ рдХрдо рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рдиреНрдирд┐рд╣рд┐рдд рд╢реНрд░реЗрдгреА рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рднреА drain_filter рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ drain рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рдЦреЛрдЬрдиреЗ рдореЗрдВ Vec рдкрд░ рдПрдХ рдЕрд▓рдЧ рдкрд╛рд╕ рдмрдирд╛рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ &mut T рд╣реИ, Vec рдореЗрдВ рдЫреЛрдбрд╝реЗ рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред рд╣реБрд░реНрд░реЗ!

рдпрд╣рд╛рдВ рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк drain_filter рдЬреИрд╕реЗ рдЗрди-рдкреНрд▓реЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:

  1. рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред
  2. рдСрдкрд░реЗрд╢рди рдХреЛ рдЬрд▓реНрджреА рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВред
  3. рдЖрдЗрдЯрдо рдХреЛ рдХреЗрд╡рд▓ рд╣рдЯрд╛рдиреЗ рдпрд╛ рдЙрд╕реЗ рдЬрдЧрд╣ рдореЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╕рдордп), рдЖрдЗрдЯрдо рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирдП рдорд╛рди рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ (рдЬреЛ рдореВрд▓ рдореВрд▓реНрдп рдХрд╛ рдХреНрд▓реЛрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред
  4. рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдХрдИ рдирдП рдЖрдЗрдЯрдо рд╕реЗ рдмрджрд▓реЗрдВред
  5. рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорджреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЬрдЧрд╣ рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВред
  6. рд╡рд░реНрддрдорд╛рди рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╣рд▓реЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд┐рдП рдмрд┐рдирд╛ рдХреБрдЫ рдирд┐рдореНрди рдЖрдЗрдЯрдо рд╣рдЯрд╛ рджреЗрдВред

рдФрд░ рдпрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдореЗрд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реИ:

  1. рдпрд╣ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдЗрдЯрдо рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрдЯрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЗрдЯрд░реЗрдЯрд░ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рднреА рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреНрд▓реЛрдирд┐рдВрдЧ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓рд░ рдХреЛ рдХреЗрд╡рд▓ Vec рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред
  2. рдЬрд▓реНрджреА рдЧрд░реНрднрдкрд╛рдд рдХрд░рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдкрд░реНрд╢реЛрдиреНрдореБрдЦ рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдкреАрдЖрдИ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрд▓реЛрдЬрд░ рдПрдХ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдореНрдпреВрдЯреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓реНрдп рддрдм рддрдХ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрдЯрд░реЗрдЯрд░ рдХреЗ рдкрд╛рд╕ рди рд╣реЛ рд╕реЗрд╡рди рдХрд┐рдпрд╛ рдЧрдпрд╛ред
  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 рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред)

@ johnw42 рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 3 рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рд╣реИ, рддреЛ mem::replace рдпрд╛ mem::take рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

@johnw42 @jplatte

(3) рдХреЗрд╡рд▓ рддрднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рд╣рдо рд▓реМрдЯрд╛рдП рдЧрдП Iterator рдХреЗ рдЖрдЗрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЖрдЗрдЯрдо рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
(3) рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рджреЛрдиреЛрдВ Iterator рддрддреНрд╡ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдирдпрд╛ рддрддреНрд╡ рд╡рд╛рдкрд╕ Vec рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ: рдореИрдВ Replace(T) рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд▓рдЯ рджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ PushOut(T) рдмрджрд▓ рджреВрдВрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп PushOut рдХреЗ рдЖрдВрддрд░рд┐рдХ рдореВрд▓реНрдп рдХреЛ "рд╕рдмрдорд┐рдЯ" рдХрд░рдирд╛ рд╣реИред Vec рдореЗрдВ рдореВрд▓ (рдкреИрд░рд╛рдореАрдЯрд░) рдЖрдЗрдЯрдоред

Stop рд╢рд╛рдпрдж Error рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдпрд╛ try_fold рддрд░рд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛рдо рдХрд░реЗрдВ?)

рдореИрдВрдиреЗ рдХрд▓ рд░рд╛рдд рдЕрдкрдирд╛ super_drain_by_value рд╕рдорд╛рд░реЛрд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ рдХрдИ рдЪреАрдЬреЗрдВ рд╕реАрдЦреАрдВред

рд╢реАрд░реНрд╖рдХ рдЖрдЗрдЯрдо рд╢рд╛рдпрдж рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐, рдХрдо рд╕реЗ рдХрдо wrt Vec , рд╣рдо рдпрд╣рд╛рдВ рдЬреЛ рдХреБрдЫ рднреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ "рдЕрдЪреНрдЫрд╛ рд╣реЛрдирд╛" рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣реИ (рдореВрд▓ рд░реВрдк рд╕реЗ рдирдИ рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд), рдХреНрдпреЛрдВрдХрд┐ Vec рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реАрдзреЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪреЗрддрд╛рд╡рдиреА рд╣реИ рдХрд┐ рдЖрдк рдЦрд╛рд▓реА Vec рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрд╕реНрдерд┐рд░ into_raw_parts рд╡рд┐рдзрд┐ рдЙрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕реЗрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЖрд╕рд╛рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Vec<i32> ), Vec рдореЗрдВ рдФрд░ рдмрд╛рд╣рд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪрд╛рд▓реЗрдВ рдПрдХ рдЧреИрд░-рдореБрджреНрджрд╛ рд╣реИрдВ, рдФрд░ рдЙрд╕ рд░рд╛рд╢рд┐ рдХреЛ рд╕рд╛рдзрд╛рд░рдг рдЪреАрдЬреЛрдВ рдХреА рддрд░рд╣ рдХрд╣рддреЗ рд╣реИрдВ рдПрдХ рдиреЛ-рдСрдк рдпрд╛ Vec рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдирд╛ рдХреЛрдб рдореЗрдВ рддрдмреНрджреАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реБрдзрд╛рд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (рдХреНрд░рдорд╢рдГ рд╢реВрдиреНрдп рдФрд░ рддреАрди рдирд┐рд░реНрджреЗрд╢)ред рдмреБрд░реА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХрдард┐рди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ drain_filter рдкрджреНрдзрддрд┐ рджреЛрдиреЛрдВ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдореЛрдЯреЗ рддреМрд░ рдкрд░ рддрд░реАрдХреЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ Vec<[u8; 1024]> рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдФрд░ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ memcpy рдкрд░ рджреЛ рдХреЙрд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдиреЛ-рдСрдк рдХреЙрд▓ рднреА рдкреВрд░реЗ рдмрдлрд░ рдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрдкреА рдХрд░ рджреЗрддреА рд╣реИ!

рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдореЗрд░реА рдПрдкреАрдЖрдИ, рдЬреЛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд▓рдЧрддреА рд╣реИ, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрддрдиреА рдЕрдЪреНрдЫреА рдирд╣реАрдВ рд╣реИ; рдХреНрд▓реЛрдЬрд░ рд╕реЗ рдПрдХ рдПрдирдо рд╡реИрд▓реНрдпреВ рд▓реМрдЯрд╛рдирд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рднреА рдореЗрдВ рд╕реБрдВрджрд░ рд╡рд░реНрдмреЛрдЬрд╝ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреНрд▓реЛрдЬрд░ рдПрдирдо рд╡реИрд▓реНрдпреВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рдФрд░ рднреА рдмрджрд╕реВрд░рдд рд╣реИред

рдореИрдВрдиреЗ DrainAction::Stop рдХреЛ R рдореВрд▓реНрдп рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬреЛ super_drain_by_value рд╕реЗ super_drain_by_value Option<R> рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдФрд░ рднреА рдмрджрддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ (рд╕рдВрднрд╡рддрдГ рд╕рд╛рдорд╛рдиреНрдп) рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рдВрдХрд▓рдХ R рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЙрд╕ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ super_drain_by_value рдХреЗ рдХреЙрд▓рд░ рдХреЛ рдХреНрд▓реЛрдЬрд░ рд╕реЗ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ; рдпрд╣ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдорд╛рди рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ loop {} рдирд┐рд░реНрдорд╛рдг рдПрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓реВрдк () рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред

рд╡реНрдпрд╛рдкрдХрддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╕рдордпрдкреВрд░реНрд╡ рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВ: рдПрдХ рдЬрд╣рд╛рдВ рд╢реЗрд╖ Vec рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╡рд╣рд╛рдВ рдЬрдЧрд╣ рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рд╕рдордпрдкреВрд░реНрд╡ рд╕рдорд╛рдкреНрддрд┐ рдХрд╛ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рддреЛ рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ Keep(n) рдпрд╛ Drop(n) рд▓реМрдЯрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ n рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреА рдЕрднреА рддрдХ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдордпрдкреВрд░реНрд╡ рд╕рдорд╛рдкреНрддрд┐ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ Keep / Drop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдХреЛрдб рдкрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдПрдкреАрдЖрдИ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓реЛрдЬрд░ рд░рд┐рдЯрд░реНрди () рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд╕реНрддреБ рдкрд╛рд╕ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ (рдЬрд┐рд╕реЗ рдореИрдВ рдпрд╣рд╛рдВ "рдЕрдкрдбреЗрдЯрд░" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реВрдВрдЧрд╛) рдЬреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Vec рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдЪрд┐рдд рдирд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ borrow , borrow_mut , рдФрд░ take , рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдЬреИрд╕реЗ keep_next(n) рдпрд╛ drop_remainder() рдХреЗ рд╕рд╛рдеред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЕрдкрдбреЗрдЯрд░ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд░реАрдХреЛрдВ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ self рд▓реЗрдиреЗ рд╕реЗ, рдХреЙрд▓рд░ рдХреЛ take рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ, рдпрд╛ рдмрд╛рдж рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдирд┐рд░реНрджреЗрд╢ рджреЗрдиреЗ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЖрд╕рд╛рди рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдореИрдВрдиреЗ рдЖрдЬ рд╕реБрдмрд╣ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ "рдЬрд╝рд┐рдкрд░" рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдкрд╣рд▓реЗ рдУрдХреИрдорд▓ рдореЗрдВ рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрд╕ рд▓рдШреБ рдкреЗрдкрд░ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдФрд░ рдЕрдиреНрдп рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХрд╛рдЧрдЬрд╛рдд рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрд┐рдд рд╣реИред Zippers рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ "рдЬрдЧрд╣ рдореЗрдВ" рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЬрд╝рд┐рдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯрд░реНрдмреЛрдЪрд╛рд░реНрдЬреНрдб рдЗрдЯрд░реЗрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВред

рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЖрдк рдЬрд╝рд┐рдкрд░ рдХреЛ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рдмрдирд╛рдХрд░ "рдЬрдЧрд╣ рдореЗрдВ" рд╢рдмреНрджрд╛рд░реНрде рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ; рд░рд╕реНрдЯ рдореЗрдВ, рдЖрдк рдЬрд╝рд┐рдк рдХреЛ mut рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ Vec рдзрд╛рд░рдг рдХрд░рдХреЗ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ 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 рдХреНрд░реЗрдЯ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛ рджреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Remover рд╕рдВрд░рдЪрдирд╛ , рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд "рдЬрд╝рд┐рдкрд░" рдЕрд╡рдзрд╛рд░рдгрд╛ рдмрд╣реБрдд рд╕рдорд╛рди рд▓рдЧрддреА рд╣реИ! рдпрд╣ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЬрдм рдЖрдк рдХреБрд▓ рдирд┐рдпрдВрддреНрд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдпрд╣ рд╢рд╛рдпрдж рдмрд╣реБрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ drain_filter рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рд╣рдореЗрд╢рд╛ рдЖрдВрддрд░рд┐рдХ рдХреЛ рд╕реНрд╡реИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред drain_filter рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╣рдореЗрд╢рд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрджрд▓рд╛рд╡ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╡рд╣ рд╣реИ RangeBounds рдкреИрд░рд╛рдореАрдЯрд░ред

@timvermeulen рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ RangeBounds рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдХреНрд▓реЛрдЬрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ ( F: FnMut(&mut T) -> bool ) рд░рдЦреЗрдВред
рдЖрдк рдбреНрд░реЗрди рдХрд┐рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреЛ filter_map рдпрд╛ рдЬреЛ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
(рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреНрд▓реЛрдЬрд░ рддрддреНрд╡ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ retain рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдЗрд╕ рдЧрд▓рддреА рдХреА рдЦреЛрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред)

рд╣рд╛рдБ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмреАрдЪ рд╕рд╣реА рд╕рдВрддреБрд▓рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

@timvermeulen рд╣рд╛рдБ, рдореИрдВ рдореБрдЦреНрдп рд╡рд┐рд╖рдп рд╕реЗ рдмрд╣реБрдд рджреВрд░ рднрдЯрдХ рд░рд╣рд╛ рдерд╛ред

рдПрдХ рдмрд╛рдд рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦреА рд╣реИ рдЬреЛ рдореВрд▓ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рдХрд╣ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдЗрдЯрдо рдХреЛ рд░рдЦрдирд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрддрд╛рдирд╛ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ рдХрд┐ v.drain_filter(p) рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде v.iter().filter(p) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

filter рдХреЗ рд╕рд╛рде, рдмреВрд▓рд┐рдпрди рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╕реЗ рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рд░реНрдп рд╣реИ, рдФрд░ IMHO рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рд╣рдЬ рд╣реИ рдХрд┐ рд╡рд┐рдзреЗрдп рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ "рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?" рдЗрд╕рдХреЗ рдмрдЬрд╛рдп "рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рддреНрдпрд╛рдЧ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?" drain_filter рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрдЯрд░реЗрдЯрд░ рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ рддреЛ рд╡рд╣реА рддрд░реНрдХ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрдирдкреБрдЯ Vec рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рд╢реНрди рдмрди рдЬрд╛рддрд╛ рд╣реИ "рдХреНрдпрд╛ рдореБрдЭреЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕реЗ рд░рдЦ рд▓реЛ?"

рд╕рдЯреАрдХ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ filter рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ predicate (рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Iterator::filter ) рдФрд░ рдЗрд╕ рд╡рд╛рдХреНрдп рдХреЛ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдХрд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ:

рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ predicate рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ drain_filter Iterator::filter рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЪрдпрдирд┐рдд рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде self рд╕реЗ рдЖрдЗрдЯрдоред

@ рдЬреЙрди 42 рд╣рд╛рдБ, рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 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 рдкреНрд░рддреНрдпрдп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд┐рд╕рд╛рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рди рдкреНрд░рддреНрдпрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
  • drain().where() рдХреА рднрд┐рдиреНрдирддрд╛, рдХреНрдпреЛрдВрдХрд┐ where рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИред
  • drain_retain : retain рдХреЗ рдЕрдиреБрд░реВрдк, рд▓реЗрдХрд┐рди retain рдФрд░ drain рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдмреВрд▓рд┐рдпрди рдорд╛рдиреЛрдВ рдХреА рд╡рд┐рдкрд░реАрдд рд╡реНрдпрд╛рдЦреНрдпрд╛рдПрдВ рд╣реИрдВ, рдЬреЛ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
  • filtered_drain
  • drain_if
  • drain_when
  • remove_if

рдорд╛рдкрджрдВрдбреЛрдВ

drain рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЗрдгреА рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рджреЛ рдХреНрд▓реЛрдЬрд░ рдкреНрд░рд╛рд░реВрдк рд╕реБрдЭрд╛рдП рдЧрдП рд╣реИрдВ, FnMut(&mut T) -> bool рдФрд░ FnMut(T) -> Result<T, U> ред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдмреЗрдХрд╛рд░ рд╣реИред

$#$22$# retain рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмреВрд▓рд┐рдпрди рд╕реНрдерд┐рддрд┐ ( true рдХрд╛ рдЕрд░реНрде рд╣реИ " Vec рдореЗрдВ рд░рдЦреЗрдВ") рдХреЛ рдЙрд▓рдЯрдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ, рд▓реЗрдХрд┐рди рддрдм рдпрд╣ drain рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛ true рдХрд╛ рдЕрд░реНрде рд╣реИ " Vec рд╕реЗ рдирд╛рд▓реА")ред

рддрдирд╛рд╡ рдореБрдХреНрдд

рдЬрдм рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ DrainFilter рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдХреЛ Vec рдХреА рдирд┐рдХрд╛рд╕реА рд╕рдорд╛рдкреНрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдбрдмрд▓ рдкреИрдирд┐рдХ рдХреЛ рдЬреЛрдЦрд┐рдо рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реБрдП, рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рд╕рдордЭреМрддрд╛ рд╣реИрдВ:

  • рдмреВрдВрдж рдкрд░ рдирд╛рд▓реА рдЦрддреНрдо рдордд рдХрд░реЛред find рдпрд╛ all рдЬреИрд╕реЗ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдпрд╣ рдмрд╣реБрдд рдЙрд▓реНрдЯрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ v.drain_filter(...); рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рдмреЗрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдЯрд░реЗрдЯрд░ рдЖрд▓рд╕реА рд╣реЛрддреЗ рд╣реИрдВред

  • рдбреНрд░реЗрдирд┐рдВрдЧ рдХреЛ рд╣рдореЗрд╢рд╛ рдбреНрд░реЙрдк рдкрд░ рдЦрддреНрдо рдХрд░реЗрдВред рдпрд╣ рдбрдмрд▓ рдкреИрдирд┐рдХ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рддрд╛ рд╣реИ (рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧрд░реНрднрдкрд╛рдд рд╣реЛрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реБрд╕рдВрдЧрдд рдмрдирд╛рддрд╛ рд╣реИред

  • рдХреЗрд╡рд▓ рдбреНрд░реЙрдк рдкрд░ рдбреНрд░реЗрдирд┐рдВрдЧ рдЦрддреНрдо рдХрд░реЗрдВ рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдирдЗрдВрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрдмрд▓ рдкреИрдирд┐рдХ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди drain_filter рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмрдирд╛рддрд╛ рд╣реИ: рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ DrainFilter рдХреЛ рдЧрд┐рд░рд╛рдирд╛ _рдХрднреА-рдХрднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

  • рдЕрдЧрд░ рдлрд┐рд▓реНрдЯрд░ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рдирд╣реАрдВ рд╣реБрдИ рддреЛ рдХреЗрд╡рд▓ рдбреНрд░реЙрдк рдкрд░ рдбреНрд░реЗрдирд┐рдВрдЧ рдЦрддреНрдо рдХрд░реЗрдВред рдпрд╣ drain_filter рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдордЭреМрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╕рдВрдкрддреНрддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдлрд┐рд▓реНрдЯрд░ "рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ" рдмрдВрдж рд╣реЛрдиреЗ рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдпрдХреАрдирди рдХрд╛рдлреА рд╕рд╣рдЬ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдзреНрд╡рдирд┐ рд╣реИ рдФрд░ рддрдм рддрдХ рд▓реАрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрдм рддрдХ DrainFilter рд╕рдВрд░рдЪрдирд╛ рдЧрд┐рд░рд╛ рджреА рдЬрд╛рддреА рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЧрд░реНрднрдкрд╛рдд рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реБрд░рдХреНрд╖рд┐рдд/рд░рд┐рд╕рд╛рд╡ рдореБрдХреНрдд рдирд╣реАрдВ рдереЗред

рдбреНрд░реЗрди-рдСрди-рдбреНрд░реЙрдк

DrainIter рдпрд╛ рддреЛ рд╕реНрд░реЛрдд рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЧрд┐рд░рд╛рдиреЗ рдкрд░ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ рдЬрдм next рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрд▓рд╕реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐)ред

рдбреНрд░реЗрди-рдСрди-рдбреНрд░реЙрдк рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░реНрдХ:

  • drain рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдкред

  • рдЕрдиреНрдп рдПрдбреЗрдкреНрдЯрд░ рдЬреИрд╕реЗ all , any , find , рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ...

  • vec.drain_filter(...); рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред

  • рдЖрд▓рд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ drain_lazy -рд╕реНрдЯрд╛рдЗрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдпрд╛ lazy() рдПрдбрд╛рдкреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ DrainIter (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ Drain рдкрд░ рднреА рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреИрдХрд╡рд░реНрдб-рд╕рдВрдЧрдд рд╣реИ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВ)ред

рдЖрд▓рд╕реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░реНрдХ:

  • рд▓рдЧрднрдЧ рд╕рднреА рдЕрдиреНрдп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдкред

  • "рдбреНрд░реЗрди-рдСрди-рдбреНрд░реЙрдк" рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ DrainIter рдкрд░ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп Iterator::exhausting рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рджреЗрдЦреЗрдВ RFC #2370 )ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рд╕рд╛рдорд╛рди рдЫреВрдЯ рдЧрдпрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдзрд╛рдЧреЗ рдХреЛ рд╕реНрдХрд┐рдо рдХрд░рддреЗ рд╕рдордп рдирдП рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

@negamartin

рдХреНрдпрд╛ drain-on-drop рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХрд┐ рдЗрдЯрд░реЗрдЯрд░ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рдЖрдЗрдЯрдо рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ drain_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдЬреЛ рдореЗрд░рд╛ рдореВрд▓ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдерд╛)ред

рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЙрдкрдЬ рдХреЗ рджреМрд░рд╛рди рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдирд╛рд▓реА-рдкрд░-рдбреНрд░реЙрдк рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗ рдбреНрд░реЗрди-рдСрди-рдбреНрд░реЙрдк рдХреЛ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХрд┐ рдбреНрд░реЗрди-рдСрди-рдбреНрд░реЙрдк рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИред

рдмрд╕ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рдореИрдВ рдбреНрд░реЗрди-рдСрди-рдбреНрд░реЙрдк рдХрд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░рд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рд╣реИ рдЬрдм рдЗрдЯрд░реЗрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрдкрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдХреНрдпрд╛ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдЗрдЯрд░реЗрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрдкрдд рди рд╣реЛ? рдпрд╛ рдХреЗрд╡рд▓ рдЙрд╕ рддрддреНрд╡ рддрдХ рдЬреЛ рдЙрдкрднреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрд╛рдХреА рдХреЛ рдЕрдЫреВрддрд╛ рдЫреЛрдбрд╝рдХрд░?

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИ:

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]);

рдмрд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдлреЗрдВрдХрдирд╛, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

 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() рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рди рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдВ?

@ рдмрд╛рд░реНрдЯрдореИрд╕реА

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕рд╛ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░ рдорд╛рдирджрдВрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдЗрдЯрдо рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ drain_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред Drain рдФрд░ DrainFilter рдЙрд╕ рдЖрдЗрдЯрдо рдХреЛ рдпреАрд▓реНрдб рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдП рд░рдЦрд╛ рдирд╣реАрдВ рд╣реИред

@negamartin

рдмрд╕ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рдореИрдВ рдбреНрд░реЗрди-рдСрди-рдбреНрд░реЙрдк рдХрд╣рддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░рд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рд╣реИ рдЬрдм рдЗрдЯрд░реЗрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрдкрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рдЖрд╣ рдЕрдЪреНрдЫрд╛ред рдпрд╣реА рдореЗрд░реА рдЧрд▓рддреА рд╣реИред рдореИрдВрдиреЗ рдЖрдкрдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ред рдореИрдВрдиреЗ рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдереА рдХрд┐ "vec рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЧрд┐рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛", рдЬрд┐рд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдЖрд▓рд╕реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░реНрдХ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ drain рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред Iterator::exhausting RFC рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдпрджрд┐ drain рдФрд░ drain_filter рдореЗрдВ рдирд╛рд▓реА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

@negamartin

рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░: рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд╛рдоред рдлрд╝рд┐рд▓реНрдЯрд░_рдореИрдк рдЬреИрд╕реЗ рдЕрдиреНрдп рдирд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд░реВрдкред drain().filter() рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рдеред

рдпрд╣ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ (рдЗрд╕реАрд▓рд┐рдП рд╣рдореЗрдВ retain_mut / drain_filter рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):
drain().filter() рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рднреА рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ false !

рдореИрдВрдиреЗ #RFC 2870 рдореЗрдВ lib рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рд░реЗрдЦрд╛ рджреЗрдЦреА:

рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп, рдпрд╛ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдмрдирд╛рдХрд░ рдПрдХ рд╡рд┐рдзрд┐ "рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ" рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдпрджрд┐ рдпрд╣ рдЕрднреА рднреА рдкрд┐рдЫрд▓реЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реИ? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред

(рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдЗрдЯрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдЯрд░реЗрдЯрд░ рдкрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрдорддреМрд░ рдкрд░ рдПрдбреЗрдкреНрдЯрд░ рд╣реЛрддреА рд╣реИрдВ, рд╡реНрдпрд╡рд╣рд╛рд░-рдкрд░рд┐рд╡рд░реНрддрдХ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдИ рдорд┐рд╕рд╛рд▓ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП chunks рдФрд░ chunks_exact рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред , chunks().exact() рдХреЙрдореНрдмреЛ рдирд╣реАрдВред)

рдирд╣реАрдВ, рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЗрдВрдлрд╝реЗрдХреНрд╢рди рдЬреЛ
рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ рдЕрдм рдЯрд╛рдЗрдк рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рдЖрдиреБрд╡рдВрд╢рд┐рдХреА
рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдорджрдж рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИрдВред

рд╢реБрдХреНрд░, рдЬреВрди 12, 2020, 21:21 negamartin [email protected] рдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ:

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА #RFC 2870 . рдореЗрдВ lib рдЯреАрдо рдХреА рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдкрдВрдХреНрддрд┐ рджреЗрдЦреА рд╣реИ
https://github.com/rust-lang/rfcs/pull/2369 :

рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдХрд░ рдПрдХ рд╡рд┐рдзрд┐ "рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ" рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ,
рдпрд╛ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрдиред

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реИ рдпрджрд┐ рдпрд╣ рдЕрднреА рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ
рдкрд┐рдЫрд▓реЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛
рдЖрдЧреЗред

(рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдЗрдЯрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░
рдЗрдЯрд░реЗрдЯрд░ рдЖрдорддреМрд░ рдкрд░ рдПрдбреЗрдкреНрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ, рд╡реНрдпрд╡рд╣рд╛рд░-рдкрд░рд┐рд╡рд░реНрддрдХ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣рд╛рдБ рд╣реИрдВ
рдХреЛрдИ рдорд┐рд╕рд╛рд▓ рдирд╣реАрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдЦрдВрдбреВ рдФрд░ рдЦрдВрдб_рд╕рдЯреАрдХ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ
рд╡рд┐рдзрд┐рдпрд╛рдБ, рдПрдХ рд╡рд┐рдЦрдВрдбреВ рдирд╣реАрдВ ()ред рд╕рдЯреАрдХ () рдХреЙрдореНрдмреЛред)

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/43244#issuecomment-643444213 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AB2HJELPWXNXJMX2ZDA6F63RWJ53FANCNFSM4DTDLGPA
.

рдпрджрд┐ рдпрд╣ рдЕрднреА рднреА рдкрд┐рдЫрд▓реЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реИ? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред

рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ foo.method(bar.into()) рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреНрд░реЗрди_рдлрд┐рд▓реНрдЯрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рдпрдерд╛рд╡рдд рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рд╛рд░ рддрддреНрд╡реЛрдВ рдХреА рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рднреА рдкреЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред

drain_filter() рдХреЗ рд╕рд╛рде рдЬреЛ рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░, retain_mut() рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреМрди рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЕрд▓рдЧ рд╣реЛ рдЧрдИ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ retain_mut() рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА drain_filter() рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рд╣реЛред

рдирдП рдЕрд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП @ рдмрд╛рд░реНрдЯрдореИрд╕реА , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреАрдЖрд░ рдмрдирд╛рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://rustc-dev-guide.rust-lang.org/implementing_new_features.html рдкрд░ рдФрд░ https://rustc-dev-guide.rust-lang.org/getting-started.html рдкрд░ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП #рдмрд┐рд▓реНрдбрд┐рдВрдЧ-рдПрдВрдб-рдЯреЗрд╕реНрдЯрд┐рдВрдЧ-

рдореИрдВ рдЖрдЬ HashMap рдФрд░ BTreeMap рдХреЗ рдмреАрдЪ рдПрдкреАрдЖрдИ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдХреЗрд╡рд▓ рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рдПрдХ рд╢рдмреНрдж рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЧреНрд░рд╣ рдЬрдм рднреА рдПрдХ рд╕реБрд╕рдВрдЧрдд рдПрдкреАрдЖрдИ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рднрд╛рд╡рдирд╛, рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП String, Vec, HashMap, HashSet, BinaryHeap рдФрд░ VecDeque рдореЗрдВ retain рд╡рд┐рдзрд┐ рд╣реИ, рд▓реЗрдХрд┐рди LinkedList рдФрд░ BTreeMap рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ retain рдПрдХ рд▓рд┐рдВрдХреНрдбрд▓рд┐рд╕реНрдЯ рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рд╡реИрдХреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд┐рд▓реЛрдкрди рдПрдХ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред

рдФрд░ рдЬрдм рдЖрдк рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рдЦреЛрджрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╣реИрд░рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ: HashMap::retain рдХреЗ рдХреНрд▓реЛрдЬрд░ рдХреЛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЛ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рдорд┐рд▓рддрд╛ рд╣реИ (рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг char рдорд┐рд▓рддрд╛ рд╣реИ )

рдЕрдм рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ drain_filter рдЬреИрд╕реЗ рдирдП рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ 1/ retain рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ 2/ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рднреА рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ:

  • HashMap::drain_filter рдЕрдкрд╕реНрдЯреНрд░реАрдо рд░реЗрдкреЛ рдореЗрдВ рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд░рд╕реНрдЯ рдХреЗ рдПрд╕рдЯреАрдбреА AFAIK рдХреЗ рд╕рд╛рде рд╢рд┐рдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╣ рдбреЙрдХреНрд╕ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ)
  • BTreeMap::drain_filter , Vec::drain_filter , LinkedList::drain_filter рд░рд╕реНрдЯ рдХреЗ рдПрд╕рдЯреАрдбреА рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлреАрдЪрд░ рдЧреЗрдЯреЗрдб рд╣реИрдВ
  • VecDeque::drain_filter рдмрд┐рд▓реНрдХреБрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
  • String::drain_filter рдпрд╛ рддреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ

рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдХреЛрдИ рдордЬрдмреВрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрджрд┐ рд╣рдореЗрдВ drain_filter , retain рдпрд╛ рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдмрд╣реБрдд рджреГрдврд╝ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпреЗ API рд╕рднреА рд╕рдВрдЧреНрд░рд╣реЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП .

рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЗ рд╕рдорд╛рди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ retain рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди IMO рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mcarton picture mcarton  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

modsec picture modsec  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmegaffin picture jmegaffin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

behnam picture behnam  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dtolnay picture dtolnay  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ