@KentaNakajima Да, довольно. Я немного удивлен, что это не более известная проблема, учитывая, насколько полезны принуждения. Хотя, честно говоря, я никогда особо не думал об этом; Я думаю, что это правда для большинства пользователей.
аюКаковы точные правила автоматической разыменования в Rust? от начала до конца, но у меня все еще есть вопрос о приведении массива к срезу.
Давайте подумаем о следующем коде:
let arr: &[i32; 5] = &&&[1, 2, 3, 4, 5];
// let arr: &[i32] = &&&[1, 2, 3, 4, 5]; // Error; expected slice, found reference
Я ожидаю, что&&&[1, 2, 3, 4, 5]
имеет тип,&&&[i32; 5]
и ссылки на&&[i32; 5]
=>&[i32; 5]
=>&[i32; 5]
=>&[i32]
, но результат отличается от того, что я ожидал.
Я попытался запустить следующий код:
let arr: &&&[i32; 5] = &&&[1, 2, 3, 4, 5];
let n = arr.first().unwrap(); // 1
Это правильный код. Типarr
принужден к&&&[i32; 5]
=>&&[i32; 5]
=>&[i32; 5]
=>&[i32]
и соответствует первому аргументуfirst
в срез,&self
.
В каком состоянии приводятся массивы к ломтикам? Я не понимаю разницу между первым и вторым кодом.
Я тоже проверилдокументация в исходном кодеи предположите, что приведенный выше вопрос имеет отношение к приведенному ниже предложению;
Однако мы иногда делаем другие корректировки и принуждения на этом пути, в частности, изменение размера (например, преобразование из [T; n] в [T]). `