Что означает выражение «Rust не будет преобразовывать целые числа в ссылки»? - PullRequest
0 голосов
/ 06 мая 2019

В разделе Ссылки никогда не бывают пустыми в книге Программирование Rust , они указывают, что нет никакого аналога С NULL. Это немного я понимаю. Затем они заявляют

Rust не будет преобразовывать целые числа в ссылки (вне кода unsafe), поэтому вы не можете преобразовать ноль в ссылку.

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

Обратите внимание, что это прекрасно компилируется

let i = 0;
let ri = &i;
println!("{}", i);
println!("{}", ri);

так что они, вероятно, не говорят об этом.

Примечание: я думаю, что на мой первоначальный вопрос в основном ответил Почему нулевой адрес используется для нулевого указателя?

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Во время выполнения ссылка - это просто usize, представляющая адрес некоторых данных в памяти.Книга пытается сказать, что вы не можете взять целое число, а затем обращаться с ним как с адресом, а затем пытаться получить данные, которые там хранятся.Например, это терпит неудачу:

let an_integer: usize = 12345;
let some_value: &bool = an_integer;

С кодом unsafe вы можете сделать это:

let an_integer: usize = 12345;
// Very dangerous: transmute unsafely converts between any two types as long as they are the same size:
let some_value: &bool = unsafe { std::mem::transmute(an_integer) };
// Less dangerous, but still dangerous:
let some_value: &bool = unsafe { &*(an_integer as *const bool) };

1 голос
/ 06 мая 2019

Они означают что-то вроде этого:

let ref_to_int: &u32 = 42;

Он не скомпилируется, потому что целое число (42) не может быть преобразовано в ссылку.Вы можете взять ссылку на число 42, но вы не можете преобразовать само число 42 в ссылку.

На языке C это было бы возможно,потому что и адреса памяти (указатели) и целые числа по сути одно и то же (число).Это может вызвать ошибки, поэтому Rust запрещает это.

...