Size: a a a

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

2020 April 20

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Эрик
Ты сперва кнопку Share нажми, а потом копируй ссылку из шары.
спасибо, чет я тупанул
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Alex Zhukovsky
Игрался со структурками из статьи парс донт валидейт, вот что вышло: https://play.rust-lang.org/?version=nightly&mode=release&edition=2018&gist=4519d3d6631cea5f344bdc032ecbb609

Вроде эффективно
У тебя память не утекает?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Подожди, это вообще UB, кажется
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Drop для Vec сделает free() не по тому адресу
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Miri детектит утечку
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Разработчики Vec<> не тупые.
Если бы можно было удалять элемент из начала за единицу, это бы так и сделали.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Разработчики Vec<> не тупые.
Если бы можно было удалять элемент из начала за единицу, это бы так и сделали.
Time to LinkedList<> VecDeque<>!
источник

PK

Pavel Kvasnikov in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Разработчики Vec<> не тупые.
Если бы можно было удалять элемент из начала за единицу, это бы так и сделали.
Vec<Option<T>>
источник

PK

Pavel Kvasnikov in Rust — русскоговорящее сообществo
Удаляй, но будут дырки
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Pavel Kvasnikov
Vec<Option<T>>
Теперь у тебя получение по индексу за O(N)
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Проще взять linked list
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Проще взять linked list
VecDeque же
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
На самом деле, в статье был совершенно синтетический пример. В данном случае вполне достаточно сделать
struct NonEmptyVec<T>(Vec<T>);
и ограничить конструктор и деструктор
источник

В

Вафель in Rust — русскоговорящее сообществo
Bulba
наивная версия
Можно сказать что там просто должна быть "статичная" функция.  Т.е. fn(Example) -> ExampleTextID
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Но чтобы с этим можно было сколь-нибудь удобно работать, нужен delegate, которого тоже нихрена нет. Нормальные ньютайпы городить не получится.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Emmanuel Goldstein
На самом деле, в статье был совершенно синтетический пример. В данном случае вполне достаточно сделать
struct NonEmptyVec<T>(Vec<T>);
и ограничить конструктор и деструктор
нет, тут ты в типах не закодировал что у тебя непустой вектор
источник

В

Вафель in Rust — русскоговорящее сообществo
polunin.ai
для этого нужны const generics, который в найтли
Как const generics бы помогли? O_o
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Вафель
Как const generics бы помогли? O_o
хз
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
polunin.ai
нет, тут ты в типах не закодировал что у тебя непустой вектор
Это и не требуется.
Если единственный способ создать NonEmptyVec — это метод, который мы контролируем, то мы можем на этом уровне проверить, что это действительно non empty
источник

EG

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