2014-12-16 2 views
1

У меня есть этот код, который я не могу скомпилировать:Как я могу объявить & [& T]] в ржавчине?

let vec1 = [1i, 2i, 3i]; 
let vec2 = [4i, 5i]; 
let v: &[&[int]] = [&vec1, &vec2]; 

То, что я хочу здесь ясно: я хочу, чтобы указать v содержит & [INT] элементы, то есть ссылки на массивы гетерогенных размеров. Но, как бы я ни отмечал тип v, я получаю ошибки компилятора. Вышеуказанные состояния

tst.rs:8:29: 8:34 error: mismatched types: expected `&[int, ..3]`, found `&[int, ..2]`  (expected array, found array) 
tst.rs:8 let v: &[&[int]] = [&vec1, &vec2]; 
             ^~~~~ 
tst.rs:8:21: 8:35 error: mismatched types: expected `&[&[int]]`, found `[&[int, ..3], ..2]` (expected &-ptr, found array) 
tst.rs:8 let v: &[&[int]] = [&vec1, &vec2]; 
           ^~~~~~~~~~~~~~ 

Какое здесь решение?

+0

у вас просто отсутствует '&'. 'let v: & [& [int]] = & [& vec1, &vec2];' (обратите внимание на & after = =). Однако, в зависимости от того, как вы планируете использовать v, вы можете столкнуться с проблемами со временем жизни. –

ответ

2
let vec1 = [1i, 2i, 3i]; 
let vec2 = [4i, 5i]; 
let v = [vec1.as_slice(), vec2.as_slice()]; 
let v: &[&[int]] = v.as_slice(); 

Первый v имеет тип [&[int], ..2] и второй v имеет тип &[&[int]]. Мы не можем определить v типа &[&[int]] непосредственно, потому что мы должны определить хранилище для [&[int], ..2], прежде чем мы сможем его взять.

+0

Спасибо. Я попробовал многословный метод 'slice (0, vec1.len()), но не знал о' as_slice() '. – Fabien

+3

@Fabien: Обратите внимание, что с '#! [Feature (slicing_syntax)]', 'v []' эквивалентно 'v.as_slice()'. – Levans

+0

Хорошо знать, @Levans. Благодарю. – Fabien