【问题标题】:Rust Iterration over Vector and Ownership [duplicate]Rust迭代向量和所有权[重复]
【发布时间】:2020-02-04 06:08:52
【问题描述】:

我最近一直在学习 Rust。

我偶然发现了以下代码:

pub fn to_bytes(values: &[u32]) -> Vec<u8> {
    for &(mut value) in values {
        //...
    }
}

我不明白for 循环中的&amp;。这里到底发生了什么?

我发现如果您使用 for 循环遍历一个向量,您会得到一个引用 (found here):

let v = vec![1, 2, 3];
for value in &v {
    // value is a reference 
}

那我为什么在第一次剪断时需要另一个&amp;

【问题讨论】:

    标签: rust iterator


    【解决方案1】:

    我发现如果你使用 for 循环遍历一个向量,你 获得参考。

    这实际上是不正确的。这取决于你的载体。如果你的向量是一个参考,它会产生一个参考。否则它会产生一个拥有的价值。

    回到你的第一个问题:

    pub fn to_bytes(values: &[u32]) -> Vec<u8> {
        for &(mut value) in values {
            // value will be of type u32
            //...
        }
    }
    

    这称为destructuring。因为这里的values&amp;[u32] 类型,所以它通过for 循环产生的值是&amp;u32 类型。在&amp; 的帮助下,您取消引用指针,因此这里的value 变量将是u32 类型。

    或者,您也可以执行以下操作,但您的值将是 &amp;u32 类型。

    pub fn to_bytes(values: &[u32]) -> Vec<u8> {
        for mut value in values {
            // value will be of type &u32
            //...
        }
    }
    

    【讨论】:

    • 首先:感谢您关于产生参考/价值的声明。 :) 关于实际答案:它试图理解它,但我觉得这并不容易。您是说,在&amp; 的帮助下,我取消了对指针的引用。我认为* 用于取消引用(链接也这么说)。我错过了什么吗?
    • 哦,等等:迭代器产生的值与mut value的模式匹配。 &amp; 用于解构该值。我希望这是正确的o.O
    • 是的。这是正确的。 * 用在值前面,& 用在变量前面。
    • 好酷。现在我懂了。谢谢:)
    • 请在回答之前查找重复的问题和答案。
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 2021-06-28
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多