fn main() {
let data = &[1..3];
println!("Data is {:?}", data);
}
Что значит иметь &[1..3]
в качестве назначенного значения для этого утверждения?Какое значение имеет переменная в следующем фрагменте кода?
fn main() {
let data = &[1..3];
println!("Data is {:?}", data);
}
Что значит иметь &[1..3]
в качестве назначенного значения для этого утверждения?Какое значение имеет переменная в следующем фрагменте кода?
Во-первых:
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<_>
.
Конечно, поскольку это действительный шаблон! Сделаю это в следующий раз, спасибо. –
Я думаю, вы ожидаете, что 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];
Существует полезный трюк, чтобы узнать тип: 'let _:() = data;'. Это приведет к ошибке, указывающей тип данных. – starblue