The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Выпуск языка программирования Rust 1.55"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. "Выпуск языка программирования Rust 1.55" +/
Сообщение от Ordu (ok), 12-Сен-21, 10:52 
> Необходимость передачи владения при передаче аргумента в функцию - очень редко возникающая ситуация (в расте она выполняется по-умолчанию, в отличие от С/С++, которые делают копию).

Во-первых, не так уж и редко. Не надо судить по опыту C/C++, как часто это оказывается полезным: в C/C++ невозможно передать владение. Там это никто не использует не потому, что не нужно, а потому что нельзя.

Во-вторых, копия по-дефолту -- это нарушение принципа "zero-cost abstraction". Передача копии -- это дорого. Не всегда, но очень часто.

В-третьих, дефолты меняются. Вот для тех случаев, когда удобнее передавать копию, перед декларацией типа можно написать #[derive(Copy)], тогда макрос derive напишет для этого типа реализацию трейта Copy (это пустой трейт, там нету методов, т.н. трейт-маркер), а компилятор, видя что тип -- Copy, будет передавать копию, вызывая метод clone для создания этой копии. Например, если ты напишешь

let x: i32 = 2;
foo(x);
println!("{}", x);

То это сработает. Компилятор не начнёт ругаться на то, что println! использует x, откуда значение было перемещено в foo. Магия? Не, если ты передашь в функцию i32, то туда будет передана копия значения. И всё потому, что для i32 реализован трейт Copy, то есть, как бы, i32-значение при передаче из одного места в другое автоматически вызывает свой метод clone. То есть, тот вызов foo, как бы заменяется на foo(x.clone()) автоматически.

Но это, понятно, хорошо только для небольших типов. Часто для всяких enum'ов используется. Или для векторов длиной с небольшое целое число, например, длины 4. Ну и понятно, что std делает это для всех примитивных численных типов.


То есть, практически, разница лишь в том, что для объектов, которые дорого копировать, тебе придётся явно вызывать clone(), вместо того, чтобы создавать копию неявно передачей по значению. Для объектов, которые копируются легко и непринуждённо, реализован Copy, и они передаются так же, как они передавались бы в C/C++.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск языка программирования Rust 1.55, opennews, 09-Сен-21, 20:21  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру