@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]). `

Ответы на вопрос(1)

Ваш ответ на вопрос