首页 文章

为什么Rust的矢量索引语法不具有元素的所有权? [重复]

提问于
浏览
1

这个问题在这里已有答案:

当我读到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 取得向量的第一个元素的所有权?我发现在之前的chapter about vectors中,使用借用语法 let largest = &v[0] 将取得该元素的所有权 . 为什么这段代码会通过编译器?

1 回答

  • 2

    许多原始类型实现了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;
    

    You can play with it in the Playground here if you want

相关问题