为什么向量的 Rust 索引语法不获取元素的所有权?
Why doesnt Rust's index syntax for vectors take ownership of the element?
当我阅读 Rust documentation on generics 时,我发现了一个关于所有权的奇怪问题。查看以下代码段:
fn main() {
let number_list = vec![34, 50, 25, 100, 65];
let mut largest = number_list[0];
for number in number_list {
if number > largest {
largest = number;
}
}
println!("The largest number is {}", largest);
}
为什么 largest
不取得 vector 第一个元素的所有权?我发现在前面的 chapter about vectors 中,使用借用语法 let largest = &v[0]
会取得元素的所有权。为什么这段代码能通过编译器?
许多原始类型实现 the Copy
trait - 这意味着当您将它们绑定到其他变量时,它们会被复制。复制值时不存在所有权问题。
这只是为了演示目的,不是很实用...但是如果您将示例更改为使用简单的哑结构,您会发现它不再有效(因为它没有实现 Copy
):
#[derive(Debug, PartialEq)]
struct S;
fn main() {
let number_list = vec![S, S, S, S];
let mut largest = number_list[0];
for number in number_list {
if number == largest {
largest = number;
}
}
println!("The largest number is {:?}", largest);
}
然而,如果你让它实现 Copy
(和 Clone
),它将 运行 很好:
#[derive(Clone, Copy, Debug, PartialEq)]
struct S;
当我阅读 Rust documentation on generics 时,我发现了一个关于所有权的奇怪问题。查看以下代码段:
fn main() {
let number_list = vec![34, 50, 25, 100, 65];
let mut largest = number_list[0];
for number in number_list {
if number > largest {
largest = number;
}
}
println!("The largest number is {}", largest);
}
为什么 largest
不取得 vector 第一个元素的所有权?我发现在前面的 chapter about vectors 中,使用借用语法 let largest = &v[0]
会取得元素的所有权。为什么这段代码能通过编译器?
许多原始类型实现 the Copy
trait - 这意味着当您将它们绑定到其他变量时,它们会被复制。复制值时不存在所有权问题。
这只是为了演示目的,不是很实用...但是如果您将示例更改为使用简单的哑结构,您会发现它不再有效(因为它没有实现 Copy
):
#[derive(Debug, PartialEq)]
struct S;
fn main() {
let number_list = vec![S, S, S, S];
let mut largest = number_list[0];
for number in number_list {
if number == largest {
largest = number;
}
}
println!("The largest number is {:?}", largest);
}
然而,如果你让它实现 Copy
(和 Clone
),它将 运行 很好:
#[derive(Clone, Copy, Debug, PartialEq)]
struct S;