当前位置:  开发笔记 > 后端 > 正文

在从引用中分配变量时,ref和&之间的区别是什么?

如何解决《在从引用中分配变量时,ref和&之间的区别是什么?》经验,为你挑选了1个好方法。

这段代码有什么问题?

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}>`

的类型yVec.

这意味着你是:

    借入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 无需移动即可绑定.实际上,目的是在解构期间在现有对象内部引用.vecOption>ref

一般而言,在let声明中,您不会使用ref.

而自Rust 1.26以来,ref推断出模式匹配; 看到匹配人体工程学的稳定性.



1> Matthieu M...:

模式绑定可以得到一些使用;)

为了理解编译器的功能,您可以使用该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}>`

的类型yVec.

这意味着你是:

    借入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 无需移动即可绑定.实际上,目的是在解构期间在现有对象内部引用.vecOption>ref

一般而言,在let声明中,您不会使用ref.

而自Rust 1.26以来,ref推断出模式匹配; 看到匹配人体工程学的稳定性.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有