Daniro_San
@Daniro_San
Программист

Странный дизайн Rust?

Пишу я если что на плюсах, недавно попробовал Rust.
Впечатления от дизайна странные.
Во первых, почему указатели в Rust называются ссылками?
Ссылка - это псевдоним для переменной.

Но в Rust ссылки берут адрес и работают как указатели в плюсах:
let var: i32 = 1;
let link: &i32 = & var; // &var - адрес var? Это ссылка или указатель?
println! ("{}", *link); // Ссылка с оператором разыменования?


И при всем этом есть и обычные небезопасные указатели в C - стиле:
let pointer: *const i32 = &var as *const i32;
unsafe { println! ("{}", *pointer); }


И если в плюсах
int *const a=nullptr; // константный указатель
То в Rust
let a: *const i32; // указатель на константу

Вот как это вместить - после плюсов вызывает неприязнь.
Зачем называть указатель ссылкой?
  • Вопрос задан
  • 2368 просмотров
Решения вопроса 3
Rust это не C++. Почему он должен брать термины из C++?

В Java вон тоже ссылки - это указатели в терминологии C++.

Более того, ссылка от указателя отличается лишь абстракцией. В памяти это будут одинаковые ячейки, содержащие адрес.
Ответ написан
Комментировать
@DoumanAsh
>Во первых, почему указатели в Rust называются ссылками?
Во первых референс это не указатель.
Указатели это *const _ и *mut _
То что референсы имеют разыменование не делает их указателями, да и пользоваться этим не надо обычно.

Такой вопрос уже задавался если тебе интересно почитай https://users.rust-lang.org/t/solved-why-do-refere...

Во вторых ты можешь почитать о референсах
https://doc.rust-lang.org/1.10.0/book/references-a...
https://doc.rust-lang.org/1.4.0/nomicon/references.html
Ответ написан
Комментировать
@DarkEld3r
Соглашусь с предыдущем комментарием, только добавлю ещё один нюанс: ссылки в расте, точно так же, как в С++, не могут содержать нулевой указатель. Опять же, арифметика указателей с ними не работает. Как по мне, это делает их ближе к плюсовым ссылкам, несмотря на возможность брать адрес ссылки и "переназначения значения".
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka
Токсичный шарпист
Во первых, почему указатели в Rust называются ссылками?

Потому что в Rust есть свои типа умные ссылки, которые проверяются борроу-чекером - &T и &mut T.
А есть сырые указатели, которые *const T и *mut T;

Разница в том, что первые проверяются борроу-чекером, а вторые - нет.
Первые можно безопасно разыменовать и обращаться к данным, а вторые - нет.

Вот как это вместить - после плюсов вызывает неприязнь.

Просто забыть привычки от C++ и плюсовую терминологию, и использовать новую.
У вас же при изучении нового человеческого языка не возникает проблем от того что какой-нибудь кот называется кэт-ом?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы