Является ли единственной причиной использования стока (..) для сохранения выделения памяти исходной структуры? - PullRequest
2 голосов
/ 07 октября 2019

Rust имеет функцию для слива всей последовательности,

Если вам нужно слить всю последовательность, используйте полный диапазон .. в качестве аргумента. - Программирование Rust

Зачем вам когда-либо нужно сливать всю последовательность? Я могу видеть это задокументированное , но я не вижу каких-либо вариантов использования для этого,

let mut drain = vec.drain(..);

Если слив не вступает во владение, но очищает исходную структуру, какой смысл невзять на себя ответственность? Я думал, что смысл изменчивой ссылки в том, что «книга была заимствована» и что вы можете вернуть ее. Если исходная структура очищена, почему бы не «владеть» книгой? Почему вы хотите одолжить что-то и уничтожить? Имеет смысл хотеть одолжить подмножество вектора и очистить это подмножество - но я не могу обернуться, желая одолжить все это очищает первоначальную структуру.

1 Ответ

0 голосов
/ 10 октября 2019

Я думаю, что вы подходите к этому вопросу с неправильной стороны.

Приняв решение о том, что вы хотели бы иметь метод drain, который принимает RangeBounds, вам необходимо рассмотреть плюсы. и минусы запрета неограниченного RangeBounds.

Плюсы

  • Если вы запретите неограниченный диапазон, будет меньше путаницы относительно того, использовать ли drain(..) против into_iter(), хотя и отмечая, что эти два не совсем идентичны.

Минусы

  • Вам действительно придется идтине позволяйте запретить неограниченный диапазон.

  • В идеале вы хотели бы использовать неограниченный диапазон, чтобы вызвать ошибку компиляции. Я новичок в Rust, поэтому я не уверен в этом, но, насколько я знаю, нет никакого способа выразить, что drain должен использовать универсальный, который реализует черту RangeBounds, пока это не RangeFull.

  • Если это не удалось проверить во время компиляции, какое поведение вы бы хотели во время выполнения? Казалось бы, паника - единственный вариант.

  • Как отмечается в комментариях и в предложенном дубликате, после полного опустошения, Vec будет иметь длину 0, ноемкость такая же, как и до вызова drain. Допуская неограниченный диапазон с drain, вы облегчаете избежать повторного выделения памяти в некоторых случаях использования.

По крайней мере, для меня минусы перевешивают плюсы.

...