这段代码有什么问题?
fn example() { let vec = vec![1, 2, 3]; let &_y = &vec; }
error[E0507]: cannot move out of borrowed content
--> src/lib.rs:3:15
|
3 | let &_y = &vec;
| --- ^^^^ cannot move out of borrowed content
| ||
| |data moved here
| help: consider removing the `&`: `_y`
|
note: move occurs because `_y` has type `std::vec::Vec`, which does not implement the `Copy` trait
--> src/lib.rs:3:10
|
3 | let &_y = &vec;
| ^^
为什么这是正确的?
let vec = vec![1, 2, 3]; let ref _y = &vec;
Matthieu M... 8
模式绑定可以得到一些使用;)
为了理解编译器的功能,您可以使用该let _: () = ...;
技巧.通过分配类型变量()
,可以强制编译器打印一条错误消息,为您提供为变量推断的类型.
在第一个例子中:
let vec = vec![1, 2, 3]; let &y = &vec; let _: () = y;
我们得到:
error[E0308]: mismatched types --> src/lib.rs:4:13 | 4 | let _: () = y; | ^ expected (), found struct `std::vec::Vec` | = note: expected type `()` found type `std::vec::Vec<{integer}>`
的类型y
是Vec
.
这意味着你是:
借入vec
一个临时的
试图vec
进入y
,这是被禁止的,因为vec
已经借来了.
等效的正确代码是:
let vec = vec![1, 2, 3]; let y = vec;
在第二个例子中:
let vec = vec![1, 2, 3]; let ref y = &vec; let _: () = y;
我们得到:
error[E0308]: mismatched types --> src/lib.rs:4:17 | 4 | let _: () = y; | ^ expected (), found reference | = note: expected type `()` found type `&&std::vec::Vec<{integer}>`
y
就是这样&&Vec
.
这让我们看到它let ref a = b;
通常相当于let a = &b;
,因此在这种情况下:let y = &&vec;
.
ref
是为了解构; 例如,如果你有:
let vec = Some(vec![1, 2, 3]); if let Some(ref y) = vec { // use `y` here }
即使这里有类型,你也可以ref
在这里使用y
,&Vec
无需移动即可绑定.实际上,目的是在解构期间在现有对象内部引用.vec
Option
ref
一般而言,在let
声明中,您不会使用ref
.
而自Rust 1.26以来,ref
推断出模式匹配; 看到匹配人体工程学的稳定性.
模式绑定可以得到一些使用;)
为了理解编译器的功能,您可以使用该let _: () = ...;
技巧.通过分配类型变量()
,可以强制编译器打印一条错误消息,为您提供为变量推断的类型.
在第一个例子中:
let vec = vec![1, 2, 3]; let &y = &vec; let _: () = y;
我们得到:
error[E0308]: mismatched types --> src/lib.rs:4:13 | 4 | let _: () = y; | ^ expected (), found struct `std::vec::Vec` | = note: expected type `()` found type `std::vec::Vec<{integer}>`
的类型y
是Vec
.
这意味着你是:
借入vec
一个临时的
试图vec
进入y
,这是被禁止的,因为vec
已经借来了.
等效的正确代码是:
let vec = vec![1, 2, 3]; let y = vec;
在第二个例子中:
let vec = vec![1, 2, 3]; let ref y = &vec; let _: () = y;
我们得到:
error[E0308]: mismatched types --> src/lib.rs:4:17 | 4 | let _: () = y; | ^ expected (), found reference | = note: expected type `()` found type `&&std::vec::Vec<{integer}>`
y
就是这样&&Vec
.
这让我们看到它let ref a = b;
通常相当于let a = &b;
,因此在这种情况下:let y = &&vec;
.
ref
是为了解构; 例如,如果你有:
let vec = Some(vec![1, 2, 3]); if let Some(ref y) = vec { // use `y` here }
即使这里有类型,你也可以ref
在这里使用y
,&Vec
无需移动即可绑定.实际上,目的是在解构期间在现有对象内部引用.vec
Option
ref
一般而言,在let
声明中,您不会使用ref
.
而自Rust 1.26以来,ref
推断出模式匹配; 看到匹配人体工程学的稳定性.