Size: a a a

2021 April 29

ΑZ

Αλεχ Zhukovsky in rust_offtopic
ну хз, это сложная тема
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
но поинт хороший, да
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
уговорил
источник

r

red75prime in rust_offtopic
или молча присвоил значение элементу вектора или сделал truncate или .filter().collect(). libstd очень серьёзно придётся дорабатывать/переделывать
источник

TK

Traveller Kolsky in rust_offtopic
Только forget должен в явном виде приводить к утечкам. Drop в среде без паник при вызове не должен как раз.
источник

KR

Kai Ren in rust_offtopic
Если std смогут затащить в эдишны, то буде круто.
источник

EG

Emmanuel Goldstein in rust_offtopic
Не придётся. Все старые типы работают как было. Relevant-типы просто нельзя дропнуть. Если статический анализ обнаруживает, что вызывается <T as Drop>::drop() where T: Relevant, то это ошибка.
источник

EG

Emmanuel Goldstein in rust_offtopic
Вместо этого можно давать им трейт Dispose, который никогда в явном виде не вызывается и определяет fn dispose(self)
источник

EG

Emmanuel Goldstein in rust_offtopic
Drop analysis, который знает, что Vec<T> может дропнуть T уже существует
источник

r

red75prime in rust_offtopic
А может не дропнуть, если пустой
источник

EG

Emmanuel Goldstein in rust_offtopic
Пофиг. Vec<T>: Relevant where T: Relevant и .dispose() вектора избавляется от всех внутренних типов
источник

EG

Emmanuel Goldstein in rust_offtopic
Если T: !Dispose, то можно сделать .dispose_if_empty(self) -> Option<Self>
источник

r

red75prime in rust_offtopic
Собственно, вектор эффективно становится append_only
источник

r

red75prime in rust_offtopic
Хм... Или нет
источник

EG

Emmanuel Goldstein in rust_offtopic
Да нет. Делай с ним что хочешь, главное — не забудь в конце либо диспознуть, либо убедиться, что пустой.
источник

EG

Emmanuel Goldstein in rust_offtopic
Через .dispose_if_empty()
источник

EG

Emmanuel Goldstein in rust_offtopic
При этом .dispose() требует T: Dispose, а .dispose_if_empty() — нет.
источник

EG

Emmanuel Goldstein in rust_offtopic
Можно ещё какого-нибудь сахара положить
Например,
.dispose_with<F: FnMut(T)>(self, f: F)

который уничтожает все свои элементы, вызывая на них f, а потом убивает вектор
источник

EG

Emmanuel Goldstein in rust_offtopic
Соответственно, Vec::dispose это просто .dispose_with(T::dispose)
источник

r

red75prime in rust_offtopic
Что хочешь, кроме операций, которые вызывают неявный дроп элементов. vec[i]=x, выкидываем. Пишем vec.push(x), vec.swap_remove(i).dispose()
источник