Size: a a a

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

2020 September 22

Э

Эрик in Rust — русскоговорящее сообществo
Heorhi
Нужен какойто slab, из которого можно удалять элементы во время итерации :(
for idx in (0..vec.len()).rev() {
if foo(vec[idx]) {
 vec.swap_remove(idx);
}
}
источник

H

Heorhi in Rust — русскоговорящее сообществo
это не то.... индексы ломаются

но я пока выкрутился через slab::retain
источник

Э

Эрик in Rust — русскоговорящее сообществo
Heorhi
это не то.... индексы ломаются

но я пока выкрутился через slab::retain
А как ещё ты хочешь? Ну можешь хранить Option<T> в слабах.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Но там придётся хранить и список None элементов.
источник

H

Heorhi in Rust — русскоговорящее сообществo
почти все слабы так и сделаны, там enum
источник

Э

Эрик in Rust — русскоговорящее сообществo
retain вроде бы как раз для такого и сделан, нет?
источник

H

Heorhi in Rust — русскоговорящее сообществo
ну почти..... просто както не очень выглядит когда по сути в фильтре для слаба, я меняю элементы....
источник

Э

Эрик in Rust — русскоговорящее сообществo
источник

Э

Эрик in Rust — русскоговорящее сообществo
Как ты через &T меняешь?
источник

Э

Эрик in Rust — русскоговорящее сообществo
А, у слаба &mut T retain выдаёт.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну сделай в две итерации — одной меняешь, второй retain.
источник

H

Heorhi in Rust — русскоговорящее сообществo
источник

H

Heorhi in Rust — русскоговорящее сообществo
это готовый крейт для слаба. оно все работает, но стремно выглядит.....

особенно вот эта конструкция
c.addr == packet.dst && checked_send(c, Message::Send(packet.clone()))
источник

r

red75prime in Rust — русскоговорящее сообществo
Для Vec в найтли есть drain_filter. В slab тоже неплохо-бы добавить
источник

r

red75prime in Rust — русскоговорящее сообществo
Хотя, с учётом возможности mem::forget на частично поглощённый итератор, там вряд ли можно оптимизировать копирование элементов при удалении.
источник

H

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

Э

Эрик in Rust — русскоговорящее сообществo
А почему просто не сразу в хашмапу?
источник

H

Heorhi in Rust — русскоговорящее сообществo
потому что с одним адресом может быть много клиентов...... и городить хешмап из слабов такоэ.....
источник

H

Heorhi in Rust — русскоговорящее сообществo
а постоянные индексы нужны, чтобы управлялка соединениями могла нормально за ними следить
источник

VK

Vasily Kondratyev in Rust — русскоговорящее сообществo
Псевдокод (по мотивам довольно сложного реального проекта):

trait Base {}
trait Derived : Base {}
trait DerivedDerived : Derived {}

trait Base объявляет ассоциированный тип N.
trait DerivedDerived объявляет другой ассоциированный тип, параметризованный N
type M = X<N> (X - независимый внешний генерик-тип)

Почему компилятор выдаёт такую ошибку?
the trait bound Self: Base is not satisfied
и предлагает добавить:
trait DerivedDerived : Base + Derived {}
?

Ведь "наследование" от Derived уже предполагает, что нужно удовлетворить и Base.

Хорошо, добавляю Base + Derived
Получаю другую ошибку:
ambiguous associated type N in bounds of Self

Ну да, теперь в DerivedDerived видны два типа N - от каждого из трейтов.

Можно ли выкрутиться? Нужно "наследовать" DerivedDerived от Derived.
источник