Могу ли я избежать использования явных описателей времени жизни и вместо этого использовать подсчет ссылок (Rc)? - PullRequest
3 голосов
/ 09 ноября 2019

Я читаю Rust Book, и все было довольно просто для понимания (спасибо авторам книги) до раздела о продолжительности жизни . Я провел весь день, читая много статей о жизни, и все же я очень не уверен в их правильном использовании.

Что я действительно понимаю, так это то, что концепция явных спецификаторов времени жизни направлена ​​на решение проблемы висячих ссылок. Я также знаю, что в Rust есть умные указатели подсчета ссылок (Rc), которые, как я полагаю, совпадают с shared_ptr в C ++, что имеет ту же цель: предотвращать висячие ссылки.

Учитывая, что эти времена жизниэто так ужасно для меня, и умные указатели очень знакомы и удобны для меня (я часто использовал их в C ++), могу ли я избежать жизни в пользу умных указателей? Или времена жизни - неизбежная вещь, которую мне придется понять и использовать в коде Rust?

1 Ответ

4 голосов
/ 10 ноября 2019

Являются ли времена жизни неизбежной вещью, которую мне придется понять и использовать в коде Rust?

Чтобы прочитать существующий код Rust, вы, вероятно, не понимаетене нужно понимать жизни. Средство проверки заимствований понимает их, поэтому, если оно компилируется, они верны, и вы можете просто просмотреть, что делает код.

Я очень не уверен в их правильном использовании.

Самое важное, что нужно понимать в аннотациях на всю жизнь, это то, что они ничего не . Скорее, это способ выразить компилятору связь между ссылками. Например, если вход и выход функции имеют одинаковое время жизни, это означает, что выход содержит ссылку на вход (или его часть) и, следовательно, не может жить дольше, чем вход. Использование их «неправильно» означает, что вы сообщаете компилятору что-то о времени жизни ссылки, что может оказаться неверным - и это даст вам ошибку, поэтому в этом нет ничего опасного!

могу ли я избежать продолжительности жизни в пользу умных указателей?

Вы могли бы отказаться от использования ссылок вообще и использовать Rc везде. Вы упустите одну из главных особенностей Rust: время жизни и ссылки образуют одну из самых важных абстракций с нулевой стоимостью, которые позволяют Rust быть быстрым и безопасным одновременно. Есть код, написанный на Rust, который никто не будет пытаться писать на C / C ++, потому что человек никогда не может быть абсолютно уверен, что он не представил ошибку памяти. Избегание ссылок Rust в пользу интеллектуальных указателей в основном приведет к более медленному коду, потому что интеллектуальные указатели имеют накладные расходы времени выполнения.

Многие API используют ссылки. Чтобы использовать эти API-интерфейсы, вам необходимо иметь представление о том, что происходит.

Лучший способ понять это просто написать код и понять, что работает, а что нет. Сообщения об ошибках Rust превосходны и очень помогут в формировании этой интуиции.

...