Разница между скопированными и клонированными итераторами Rust - PullRequest
3 голосов
/ 16 октября 2019

Я пытаюсь выяснить разницу между copied() и cloned() методами Rust's Iterator. Глядя на документы по Clone, я вижу, что это ...

Отличается от Copy тем, что Copy является неявным и чрезвычайно недорогим, в то время как Clone всегда является явным иможет или не может быть дорогим. [...] Так как Clone является более общим, чем Copy, вы также можете автоматически сделать все, что Copy будет Clone.

... но для итераторов оба метода являются явными, так что смысл copied()? Должен ли я просто всегда использовать cloned(), как это будет работать в более общем случае?

Ответы [ 2 ]

6 голосов
/ 16 октября 2019

Мне удалось найти (благодаря Питеру !) этот запрос на извлечение , который объясняет оригинальную причину добавления copied() в дополнение к cloned() ...

Цель копирования - избежать случайного клонирования элементов итератора после выполнения рефакторинга кода, из-за которого структура больше не копируется. Это довольно распространенный шаблон, который можно увидеть, вызвав rg --pcre2 '[.]map[(][|](?:(\w+)[|] [*]\1|&(\w+)[|] \2)[)]' в главном репозитории Rust. Кроме того, многие пользователи клонированных приложений на самом деле хотят просто скопировать, а изменение чего-либо, чтобы оно больше не копировалось, может привести к незаметному снижению производительности.

6 голосов
/ 16 октября 2019

Должен ли я всегда использовать cloned (), как это будет работать в более общем случае?

Часто оптимизатор Rust сможет выяснить, можно ли заменить клонс более быстрой копией. Однако это не гарантировано, поэтому используйте copied(), где можете, чтобы убедиться, что вы получите самый быстрый двоичный файл.

...