Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reference 为什么是&&&引用;在闭包参数中使用?_Reference_Rust_Borrowing - Fatal编程技术网

Reference 为什么是&&&引用;在闭包参数中使用?

Reference 为什么是&&&引用;在闭包参数中使用?,reference,rust,borrowing,Reference,Rust,Borrowing,我有两个问题: 为什么在闭包参数中使用&&x,而不仅仅是x?我知道&是传递一个对象的引用,但是两次使用它意味着什么 我不明白文件上说了什么: 因为find()接受一个引用,并且许多迭代器在引用上迭代,这可能会导致一种混淆的情况,即参数是双重引用。使用&&x可以在下面的示例中看到这种效果 为什么使用Some(&2)而不是Some(2) 1) 我认为这本书的解释很好,也许我下面的.cloned()示例会很有用。但是由于.iter()迭代引用,您必须另外指定引用,因为find需要引用 2) .ite

我有两个问题:

  • 为什么在闭包参数中使用
    &&x
    ,而不仅仅是
    x
    ?我知道
    &
    是传递一个对象的引用,但是两次使用它意味着什么

    我不明白文件上说了什么:

    因为
    find()
    接受一个引用,并且许多迭代器在引用上迭代,这可能会导致一种混淆的情况,即参数是双重引用。使用
    &&x
    可以在下面的示例中看到这种效果

  • 为什么使用
    Some(&2)
    而不是
    Some(2)

  • 1) 我认为这本书的解释很好,也许我下面的
    .cloned()
    示例会很有用。但是由于
    .iter()
    迭代引用,您必须另外指定引用,因为
    find
    需要引用

    2)
    .iter()
    正在迭代引用;因此,您可以找到一个参考

    您可以使用
    .cloned()
    查看如果不必处理引用,它会是什么样子:

    assert_eq!(a.iter().cloned().find(|&x| x == 2), Some(2));
    

    a
    的类型为
    [i32;3]
    ;三个
    i32
    s的数组。
    [i32;3]
    没有实现
    iter
    方法,但它确实解除了对
    和[i32]
    的引用。 它生成一个迭代器。 实现
    迭代器

    它使用
    &i32
    而不是
    i32
    ,因为迭代器必须处理任何类型的数组,并且并非所有类型都可以安全复制。因此,它不是将自身限制为可复制类型,而是通过引用而不是通过值对元素进行迭代

    为所有
    迭代器定义。它允许您查看每个元素并返回与谓词匹配的元素。问题:如果迭代器生成不可复制的值,那么将该值传递到谓词将使其无法从
    find
    返回。无法重新生成该值,因为迭代器(通常)不可倒带或重新启动。因此,
    find
    必须通过引用而不是通过值将元素传递给谓词

    因此,如果有一个迭代器实现了
    iterator
    ,那么
    iterator::find
    需要一个谓词,该谓词接受
    &T
    并返回
    bool
    <代码>[i32]:iter
    生成一个迭代器,该迭代器实现了
    迭代器
    。因此,对数组迭代器调用的
    Iterator::find
    需要一个谓词,该谓词采用
    &&i32
    。也就是说,它向谓词传递指向所讨论元素的指针

    因此,如果要编写
    a.iter().find(|x |…)
    ,那么
    x
    的类型将是
    &i32
    。这不能直接与文字
    i32
    2
    进行比较。有几种方法可以解决这个问题。一种是显式地取消引用
    x
    a.iter().find(|x |**x==2)
    。另一种是使用模式匹配来分解双重引用:
    a.iter().find(|&x | x==2)
    。在这种情况下,这两种方法的作用完全相同。[1]

    至于为什么使用
    Some(&2)
    :因为
    a.iter()
    &i32
    的迭代器,而不是
    i32
    的迭代器。如果您查看
    Iterator::find
    的文档,您将看到对于
    Iterator
    ,它返回一个
    选项。因此,在本例中,它返回一个
    选项
    ,因此您需要将其与之进行比较



    [1] :只有在谈到非复制类型时,差异才有意义。例如,
    |和&x |..
    无法处理
    &&String
    ,因为您必须能够将
    字符串从引用后面移出,这是不允许的。但是,
    |x |**x..
    会起作用,因为它只是到达引用内部,没有移动任何东西。

    谢谢!此外,如果任何人不理解什么是“解引用到
    &[i32]
    ”,可以根据,
    assert_eq!(a.iter().cloned().find(|&x| x == 2), Some(2));