Я пытаюсь, безуспешно, поиграть с кусочками.
Я сократил свой первый выпуск до:
fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T {
let item = slice[index];
item
}
Я ожидаю, что возвращаемый тип slice[index]
будет ссылкой, учитывая документацию:
pub trait Index<Index> {
type Output;
fn index(&'a self, index: &Index) -> &'a <Self as Index<Index>>::Output;
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
Однако компилятор дает мне ошибку:
error[E0308]: mismatched types --> src/main.rs:3:5 | 3 | item | ^^^^ expected reference, found type parameter | = note: expected type '&'a T' found type 'T'
Который я интерпретирую как означающий, что тип item
не соответствует возвращаемому типу функции (я ввел item
исключительно для цели отладки, чтобы разделить оценку выражения от возврата).
Если я переключу тип возврата на T
, который является типом item
, я получаю другое сообщение об ошибке:
error[E0508]: cannot move out of type '[T]', a non-copy slice --> src/main.rs:2:16 | 2 | let item = slice[index]; | ^^^^^^^^^^^^ | | | cannot move out of here | help: consider using a reference instead: '&slice[index]'
Немного поправившись, я обнаружил два обхода:
fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T {
&slice[index]
// ^
}
fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T {
let ref item = slice[index];
// ^~~
item
}
заставляя тип быть ссылкой, делает трюк.
Почему эти махинации необходимы в первую очередь? Я делаю что-то неправильно?