Pull to refresh

Comments 10

Это весьма странная статья. Автор не упоминает о Clone и Copy типажах, вместо этого он запутывает новичка персистентными коллекциями, примерами с числами, которые тоже значения, но почему-то имеют отличный от векторов юз кейс.


Что касается опросника, то у меня много вопросов к его содержимому. В отличие от других языков, Rust не пытается впихнуть в std всё что можно. Существует отличный крейт rpds, который можно использовать, если возникает нужда в персистентных коллекциях.

А мне понравилась статья (я, правда, оригинал читал). Очень интересный инсайт, совпадающий с моим опытом активной работы с serde_json::Value.

Уменьшил мою экзистенциальную тревогу по поводу того, что я хочу персистентный вариант этого Value. Ведь он у меня уже есть, просто clone дорогой. :)
Вот этот кусочек перевода имеет строго обратный смысл в оригинале:

>Из всего вышесказанного следует, что персистентные коллекции в Rust не обязательно должны иметь тот же самый интерфейс, что и обычные.

Оригинал:

>This implies to me that persistent collections in Rust don’t necessarily want to have a “different interface” than ordinary ones.

Как раз смысл статьи в том, что персистентные коллекции в Rust могут иметь тот же интерфейс, что и обычные, благодаря системе владения.
don't necessarily want — не обязательно хотят? Ваш перевод выражает ту же мысль, только выглядит по-другому.
Моего перевода тут нет (я скопировал перевод из статьи).

Я бы перевёл так:

Из всего вышесказанного следует, что персистентные коллекции в Rust не обязательно должны иметь тот же самыйдругой интерфейс, что и обычные.
Имело бы смысл, если бы персистентная коллекция в случае возможности заменялась на обычный массив, например когда не требуется персистентность.

Что-то я так и не понял, в чём профит от этого персистентного вектора. По всем параметрам хуже обычного, ну и зачем он тогда нужен?

Вот ссылка на комменты rpds с асимптотической сложностью для вектора. Копирование за O(1) — тот параметр, который превосходит обычный вектор. Для желающих почитать теорию: Understanding Clojure's Persistent Vectors, pt.1, Understanding Clojure's Persistent Vectors, pt.2
.


Крайне советую почитать ридми rpds, толково описано.


А вообще у этого есть реальный профит, когда тебе надо делать undo/redo и хранить историю изменений или заменять значение по индексу с возможностью отменить сделанные изменения. дерево git — персистентная структура. Смотрите доклад Inheritance Is The Base Class of Evil by Sean Parent. history_t и есть тот самый персистентный вектор.

Я понимаю так: например, когда хочется иметь историю состояний вектора, где каждый этап немного отличается от предыдущего/следующего состояния. Персистентные векторы дают как раз это — ибо общая часть у снимков векторов одна и та же, а та, что отличается(присуще только этому снимку) — у каждого снимка своя => получаем экономию памяти. С обычным вектором так не получится, ибо для хранения снимков вектора нужно каждый раз копировать(клонировать) его заново.
Sign up to leave a comment.

Articles