Size: a a a

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

2020 April 20

p

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

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
polunin.ai
метод ты можешь неправильно написать, в чем прикол. а на уровне типов у тебя не закодировано.
Ну кам он, не так просто неправильно написать метод из пяти строчек.
источник

p

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

p

polunin.ai in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Ну кам он, не так просто неправильно написать метод из пяти строчек.
ну вон @Psilon написал и получил уб
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
И когда ты его написал, везде дальше у тебя статическая валидация И ты не сломал вектор, не получил UB, не перебираешь весь вектор при парсинге.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
polunin.ai
ну вон @Psilon написал и получил уб
А потому что unsafe здесь ваще не нужен
источник

Э

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

Вроде эффективно
Таки да, UB, прямо сразу видно. Если тебе кровь из носу надо из начала удалять, бери VecDeque. А если кровь из носу ещё и Vector при этом иметь, то vec.remove(0). А если хочешь вектор с удалением из начала и скоростью как у VecDeque, то просто переверни. Или напиши свой вектор, который будет справа в буфер запихивать, а не слева.
источник

АГ

Алексей Герасимов in Rust — русскоговорящее сообществo
Emmanuel Goldstein
И когда ты его написал, везде дальше у тебя статическая валидация И ты не сломал вектор, не получил UB, не перебираешь весь вектор при парсинге.
а потом пришел твой коллега и переписал этот метод не глядя, типы сохранились а семантика опменялась
источник

p

polunin.ai in Rust — русскоговорящее сообществo
а еще у тебя в рантайм выносятся проверки на список в любом случае, раст проверяет вектор всегда даже есть ты пишешь vec[0]
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
pub fn from_vec(vec: Vec<T>) -> Option<Self> {
   if vec.len() == 0 { None } else { Some(Self(vec)) }
}
источник

EG

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

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Вероятность того, что его кто-то умудрится запороть на порядок меньше, чем ущерб от использования неестественной для языка структуры
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Считай, один тернарник
и потом написать метод который берет первый элемент и анврапит его, ага
источник

p

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

EG

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

В

Вафель in Rust — русскоговорящее сообществo
зачем тогда говоришь что они нужны?

если уж на то пошло, то там другая фича — именованные анонимные типы (не помню как точно фича называется)
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Бесплатный .pop(0) из вектора вообще ХЗ как сделать толком. Явно пример механически перенесён из хаскелля.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
крч @Psilon лучше бы ты в статье показал пример с LinkedList, он более похож на хаскелевский список чем Vec<>
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
(Или другого языка, построенного на списках)
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
polunin.ai
крч @Psilon лучше бы ты в статье показал пример с LinkedList, он более похож на хаскелевский список чем Vec<>
ну да
источник