我正在玩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
这是怎么回事?
答案 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;