2016-09-02 4 views
3
fn main() { 
    let data = &[1..3]; 
    println!("Data is {:?}", data); 
} 

Что значит иметь &[1..3] в качестве назначенного значения для этого утверждения?Какое значение имеет переменная в следующем фрагменте кода?

+5

Существует полезный трюк, чтобы узнать тип: 'let _:() = data;'. Это приведет к ошибке, указывающей тип данных. – starblue

ответ

6

Во-первых:

let foo = &[1,2,3]; 

создает временный массив с тем же жизнь, что и foo, и сохраняет ссылку на это в foo.

Однако, это не совсем то, что делает ваша программа. Как говорит другой ответ, это полезно, чтобы запустить его, и вы получите:

Data is [1..3] 

Это не выглядит как [1,2,3]! Мы можем обмануть компилятор, сообщив нам, что это на самом деле, используя его сообщения об ошибках. Мы знаем, что это определенно не (), поэтому давайте попробуем, что первый:

fn main() { 
    let data = &[1..3]; 
    let() = data; 
} 

Это дает ошибку на цели, которая включает в себя:

error: mismatched types [--explain E0308] 
--> <anon>:3:17 
    |> 
3 |>  let() = data; 
    |>   ^^ expected &-ptr, found() 
note: expected type `&[std::ops::Range<_>; 1]` 
note: found type `()` 

И это говорит нам ответ - data является ссылкой (&) к массиву из одного элемента ([_;1]), который является объектом std::ops::Range<_>.

+0

Конечно, поскольку это действительный шаблон! Сделаю это в следующий раз, спасибо. –

0

Я думаю, вы ожидаете, что data будет иметь тип &[i32; 2]; это не так. В такие времена, когда вы не уверены, вы можете проверить это, пытаясь написать:

let data: &[i32; 2] = &[1..3];

, который не будет работать. Сообщение об ошибке будет что-то вроде:

main.rs:11:26: 11:30 error: mismatched types [E0308] 
main.rs:11:26: 11:30 note: expected type `i32` 
main.rs:11:26: 11:30 note: found type `std::ops::Range<_>` 

Что вы на самом деле здесь:

let data: &[std::ops::Range<_>] = &[1..3];

Смежные вопросы