Когда я должен использовать ссылку вместо передачи права собственности? - PullRequest
0 голосов
/ 25 апреля 2018

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

Я пришел из языков, где значения неизменны по умолчанию (Haskell, Idris и т. П.).Поэтому я бы никогда не подумал об использовании ссылок вообще.Наличие одного и того же значения в двух местах кажется мне опасным (или, по крайней мере, неловким).Поскольку ссылки являются функцией, должна быть причина использовать их.

Есть ли ситуации, в которых я должен заставить себя использовать ссылки?Каковы эти ситуации и почему они полезны?Или они просто для удобства и по умолчанию передача права собственности в порядке?

1 Ответ

0 голосов
/ 25 апреля 2018

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

Они не опасны, потому что компилятор Rust не позволит вам сделать что-нибудь опасное.Если у вас есть &mut ссылка на значение, то вы не можете одновременно иметь любые другие ссылки на него.

В general вы должны передавать ссылки вокруг.Это экономит память для копирования и должно быть тем, что вы делаете по умолчанию, если только у вас нет веских причин поступить иначе.

Некоторые веские причины для передачи права собственности вместо:

  1. Когда тип значенияимеет небольшой размер, такой как bool, u32 и т. д. Часто производительность лучше перемещать / копировать, чтобы избежать уровня косвенности.Обычно эти значения реализуют Copy, и фактически компилятор может выполнить эту оптимизацию автоматически.Что-то, что можно делать бесплатно из-за строгой системы типов и неизменности по умолчанию!
  2. Когда текущий владелец значения выходит из области видимости, вы можете переместить значение в другое место, чтобы сохранить его живым.
...