繁体   English   中英

如何将Rust手册中的“ Vec中的最大值”示例转换为不使用“复制”特征?

[英]How do I convert the “largest value in a Vec” example in the Rust book to not use the Copy trait?

我正在尝试完成2018年Rust书中的 “留给读者”的练习。 他们有10-15的示例使用了Copy特征。 但是,他们建议在没有Copy的情况下实现相同的功能,而我一直在为此苦苦挣扎。

没有Copy ,我不能使用largest = list[0] 编译器建议改为使用参考。 我这样做是将largest&T 然后,编译器抱怨比较中使用的largest的是&T ,而不是T ,因此我将其更改为*largest以取消引用指针。 这很好,但随后偶然发现了largest = item ,抱怨T而不是&T 我切换到largest = &item 然后我得到一个我无法处理的错误:

error[E0597]: `item` does not live long enough
 --> src/main.rs:6:24
  |
6 |             largest = &item;
  |                        ^^^^ borrowed value does not live long enough
7 |         }
8 |     }
  |     - borrowed value only lives until here
  |
note: borrowed value must be valid for the anonymous lifetime #1 defined on the function body at 1:1...

我不明白如何延长这一价值。 它在list.iter()生存和死亡。 如何在仍仅使用引用的情况下扩展它?

这是我的代码供参考:

fn largest<T: PartialOrd>(list: &[T]) -> &T {
    let mut largest = &list[0];

    for &item in list.iter() {
        if item > *largest {
            largest = &item;
        }
    }

    largest
}

当您for &item编写代码时,这会破坏迭代器返回的每个引用,从而成为item T的类型。 您不想破坏这些引用,而是想保留它们! 否则,当您引用item ,您将引用一个局部变量,该变量不能返回,因为局部变量的寿命不足。

fn largest<T: PartialOrd>(list: &[T]) -> &T {
    let mut largest = &list[0];

    for item in list.iter() {
        if item > largest {
            largest = item;
        }
    }

    largest
}

还要注意我们如何直接比较引用,因为对实现PartialOrd类型的PartialOrd也实现PartialOrd ,将比较推迟到其引用对象(即,与原始指针不同,这不是指针比较)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM