Решил посмотреть что есть на русском языке по Rust для старта, и каково качество оригинала и перевода. Нашел книжку https://doc.rust-lang.ru/book/, решил посмотреть, хватит ли моих утомленных мозгов чтобы осилить введение в язык. Споткнулся в самом начале на элементарном примере:
io::stdin().read_line(&mut guess)
Главная задача read_line — принять все, что пользователь вводит в стандартный ввод, и сложить это в строку (не переписывая её содержимое), поэтому мы передаём эту строку в качестве аргумента. Строковый аргумент должен быть изменяемым, чтобы метод мог изменить содержимое строки.
У меня когнитивный диссонанс. В одном предложении автор пишет что ввод надо сложить в строку, не переписывая ее содержимое. Окей. В следующем предложении написано, что аргумент должен быть изменяемым, чтобы метод мог изменить содержимое строки. Так будет переписываться строка или не будет?
Подумал, что может быть перевод корявый, посмотрел оригинал - нет, там написано то же самое.
Далее:
одним из главных преимуществ Rust является безопасность и простота использования ссылок. Чтобы дописать эту программу, вам не понадобится знать много таких подробностей. Пока вам достаточно знать, что ссылки, как и переменные, по умолчанию неизменяемы. Соответственно, чтобы сделать её изменяемой, нужно написать &mut guess, а не &guess. (В главе 4 ссылки будут описаны более подробно)
Что значит, что по умолчанию ссылки неизменяемы? Ведь мне только это достаточно знать. Неизменяем «адрес», хранимый в ссылке, или неизменяемы данные, на которые указывает ссылка? Что делает синтаксис «&mut guess» ? Он дает меняться «адресу», чтобы ссылка могла указываеть на другую область памяти, или дает меняться данным, на которые указывает ссылка? Почему, блин, с самого начала людей оставляют в неизвестности, не объясняя что конкретно происходит? Концепция владения в гл. 4 тут вообще не при чем.
Почему я пишу слово «адрес» в кавычках? Потому что я не смог понять, что такое ссылка. Поэтому я не понимаю механизм работы ссылки:
- Ссылка Rust хранит адрес в памяти, где хранятся данные?
- Ссылка Rust хранит адрес в памяти, где находится внутреннее описание переменной, на которую указывает ссылка? Через которое уже будет доступ к памяти, где хранятся данные?
- Ссылка Rust вообще не хранит адрес в памяти, а хранит некий номер/дескриптор из какой-то таблицы доступных переменных, по которой получается адрес в памяти? Но тогда это адрес чего - самих данных или внутреннего описания переменной, по которой доступен адрес самих данных?
- Может быть, конструкция вообще другая?