我是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(). enumerate()获得了对元素的引用,所以我们在模式中使用.&"

如果是这样的话,为什么他们用itemitem == b' '一样.根据我的理解,如果item是一个引用,那么我需要访问引用所指向的值,比如*item == b' '.

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

推荐答案

b' 'u8.它不是一个引用,只是一个普通的,日常的标量.如果我们写的话,

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

那么item就是&u8,因为我们borrow 了底层迭代器.我们不能比较&u8u8,所以我们需要go 参考.我们可以在呼叫点

if *item == b' '

或者是在

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

但不是两者兼而有之这是你的决定,你如何deref,但你必须摆脱引用的方式.

Rust相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

展开枚举变量并返回所属值或引用

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

带扫描的铁 rust 使用滤镜

使用铁 rust S还原对多个数组执行顺序kronecker积

无法从流中读取Redis请求

可以为rust构建脚本编写单元测试吗?

JSON5中的变量类型(serde)

如何对一个特征的两个实现进行单元测试?

带引脚和不带引脚的比较功能

可以在旋转循环中调用try_recv()吗?

根据掩码将 simd 通道设置为 0 的惯用方法?

为什么Rust中无法推断生命周期?

Rust 中 Mutex<> 的深拷贝?

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

LinkedList::drain_filter::drop 中 DropGuard 的作用是什么?

在 Rust 中如何将值推送到枚举 struct 内的 vec?

具有生命周期和以后引用的可变方法

为什么这个值在上次使用后没有下降?

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?