代码之家  ›  专栏  ›  技术社区  ›  Antonio Gamiz Delgado

为什么我需要在这个代码示例中使用&

  •  1
  • Antonio Gamiz Delgado  · 技术社区  · 2 周前

    我是Rust的新用户,我正在学习实验书。我已经阅读了这一章: https://rust-book.cs.brown.edu/ch04-04-slices.html ,其中他们提出了以下代码:

        fn first_word(s: &String) -> usize {
            let bytes = s.as_bytes();
        
            for (i, &item) in bytes.iter().enumerate() {
                if item == b' ' {
                    return i;
                }
            }
        
            s.len()
        }
    

    我的怀疑是关于 &item ,他们说:

    “因为我们从.iter().enumeter()获得对元素的引用,所以我们在模式中使用&。”

    如果是这样的话,那么他们为什么要使用 item 喜欢 item == b' ' 。据我所知,如果 项目 是引用,那么我需要访问引用所指向的值,类似于 *item == b' ' .

    有人能给我解释一下其中的区别吗?如果这是一个琐碎的问题,我很抱歉。

    1 回复  |  直到 2 周前
        1
  •  1
  •   Silvio Mayolo    2 周前

    b' ' u8 。它不是一个参考,只是一个普通的、日常的标量。没有任何引用,如果我们写

    for (i, item) in bytes.iter().enumerate() {
    

    然后 item &u8 ,因为我们借用了底层迭代器。我们无法比较 &u8 u8 ,所以我们需要取消。我们可以去呼叫现场

    if *item == b' '
    

    或者在模式中

    for (i, &item) in bytes.iter().enumerate()
    

    但不是两者都有。如何取消是你的决定,但你必须以某种方式删除引用。