Size: a a a

Rust — русскоговорящее сообществo

2020 September 30

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
(у меня вышло такое)

Ненужные элементы свапаются к началу, нужные заменяются на None.
Мне кажется, Option там не нужен. Он особенно не нужен, если T: Default, потому что можно mem::take сделать и обойтись без unsafe вообще.

use std::mem;

pub fn retain_drain<T, F, G>(v: &mut Vec<T>, mut filter: F, mut on_remove: G)
where
   T: Default,
   F: FnMut(&T) -> bool,
   G: FnMut(T),
{
   let len = v.len();
   let mut del = 0;

   {
       let v = &mut **v;

       for i in 0..len {
           let item = &mut v[i];
           if !filter(item) {
               del += 1;
               on_remove(mem::take(item));
           } else if del > 0 {
               v.swap(i - del, i);
           }
       }
   }

   v.truncate(len - del);
}
источник

В

Виталий in Rust — русскоговорящее сообществo
Mikail Bagishov
Если тебе нужно читать фиксированное число байт, то это read_exact из трейта Read
Да спасибо
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Мне кажется, Option там не нужен. Он особенно не нужен, если T: Default, потому что можно mem::take сделать и обойтись без unsafe вообще.

use std::mem;

pub fn retain_drain<T, F, G>(v: &mut Vec<T>, mut filter: F, mut on_remove: G)
where
   T: Default,
   F: FnMut(&T) -> bool,
   G: FnMut(T),
{
   let len = v.len();
   let mut del = 0;

   {
       let v = &mut **v;

       for i in 0..len {
           let item = &mut v[i];
           if !filter(item) {
               del += 1;
               on_remove(mem::take(item));
           } else if del > 0 {
               v.swap(i - del, i);
           }
       }
   }

   v.truncate(len - del);
}
Мне не удобно так делать, т.к. функции должны мутировать один счётчик
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Мне не удобно так делать, т.к. функции должны мутировать один счётчик
Так оно FnMut, нет?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Можно и filter сделать FnMut(&mut T), там никакой разницы.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Так оно FnMut, нет?
Так обоим кложурам надо мутировать одно и то же.

Also, у тебя нету выхода
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Так обоим кложурам надо мутировать одно и то же.

Also, у тебя нету выхода
А зачем он там нужен?
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Так обоим кложурам надо мутировать одно и то же.

Also, у тебя нету выхода
Ну, Cell в помощь.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
А зачем он там нужен?
Чтобы закончить это всё, когда я выбрал достаточное кол-во элементов
источник

Э

Эрик in Rust — русскоговорящее сообществo
Или можно заинлайнить кложуры.
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Чтобы закончить это всё, когда я выбрал достаточное кол-во элементов
А, ну тогда только Option<T>. Только твой код truncate делает не на пустые айтемы, а на те, которые в конце.
источник

Э

Эрик in Rust — русскоговорящее сообществo
У тебя вообще truncate не должно быть в таком случае.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Только

if self.none_count > self.vec.len() / 2 { self.vec.retain(Option::is_some); self.none_count = 0; }
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Так все None у меня в конце
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Так все None у меня в конце
Нет же.
источник

Э

Эрик in Rust — русскоговорящее сообществo
А, да, ты перед бриком свапаешь.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Но это какое-то неэффективное дело, нет? У тебя итерация какая-то не очень получается, если брикнется.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Но это какое-то неэффективное дело, нет? У тебя итерация какая-то не очень получается, если брикнется.
Ну это не хуже чем итерироваться, ничего не делая 🤷‍♂️

В unsafe версии там может быть 1 ptr::copy вместо свапов
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
Ну это не хуже чем итерироваться, ничего не делая 🤷‍♂️

В unsafe версии там может быть 1 ptr::copy вместо свапов
Почему ты не хочешь просто vec.iter_mut().filter_map(Option::as_mut)?
источник

Э

Эрик in Rust — русскоговорящее сообществo
И удалять без свапов.
источник