在Rust中分配之前参考

时间:2018-11-17 19:45:14

标签: rust

我正在玩Rust参考:

fn main() {
    let str = String::from("Hallo");
    let &x = &str;
}

这会产生以下错误:

error[E0507]: cannot move out of borrowed content
 --> src/main.rs:3:9
  |
3 |     let &x = &str;
  |         ^-
  |         ||
  |         |hint: to prevent move, use `ref x` or `ref mut x`
  |         cannot move out of borrowed content

这是怎么回事?

2 个答案:

答案 0 :(得分:3)

添加到wiomoc's answer中:根据您先前所知道的语言,Rust中的变量声明可能有所不同。而在C / C ++中,您必须明确声明要使用指针/引用变量:

int *p = &other_int;

在Rust中,仅使用let就足够了,因此以上内容在Rust中都是

let p = &other_int;

以及写作时

let &s = &string;

它与模式匹配,因此Rust编译器大致将其读取为“我知道我有一个引用,我想将它所引用的任何内容都绑定到名称p”。如果您不熟悉模式匹配,那么一个更明显的示例(同样适用于Rust)也可以

let point = (23, 42);
let (x, y) = point;

第二行将右侧的数据包解压缩以匹配左侧(均为两个值的元组),并将左侧的变量名称绑定到右侧结构中相同位置的值。在上述情况下,匹配您的“结构描述”不太明显。

let &x = &str;的结果,即“我知道&str是一个引用,请绑定它对变量x的引用”意味着您正在尝试拥有{{ 1}}与x相同,而在那一行中,您所拥有的只是对str的借用引用。这就是为什么编译器告诉您不能从引用中创建一个拥有的值(str之所以会是它的原因,因为它没有被创建为引用)。

答案 1 :(得分:1)

您不需要def sorter(x): hrs, mins = map(int, x.split(':')) return 60*hrs + mins res = sorted(L, key=sorter) print(res) ['2:50', '2:56', '3:04', '3:17', '4:29', '4:39', '5:11', '5:24', '6:27', '7:15'] 处的&

let x

或者如果您想手动声明类型

let str = String::from("Hallo");
let x = &str;