我是铁 rust 新手,我正在用铁 rust 书学习它.

最近,我在那里发现了这个函数:

// Returns the number of characters in the first
// word of the given string

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()
}

如您所见,作者在这里使用了字符串::as_bytes()方法来枚举一个字符串.然后,他们将char‘’转换为U8类型,以判断我们是否已到达第一个单词的末尾.

据我所知,还有另一种 Select ,看起来要好得多:

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

在这里,我使用的是字符串::chars()方法,该函数看起来要干净得多.

所以问题是:is there any difference between these two things?如果是这样的话,哪一个更好,为什么?

推荐答案

如果您的字符串恰好是纯ASCII(其中每个字符只有一个字节),则这两个函数的行为应该相同.

然而,Rust被设计为支持UTF8字符串,其中一个字符可以由多个字节组成,因此最好使用s.chars(),如果字符串中有非ASCII字符,它将允许您的函数仍按预期工作.

正如@eggyal指出的那样,Rust有一个str::split_whitespace方法,它返回一个遍历单词的迭代器,该方法将拆分所有空格(而不仅仅是空格).您可以这样使用它:

fn first_word(s: &String) -> usize {
    if let Some(word) = s.split_whitespace().next() {
        word.len()
    }
    else {
       s.len() 
    }
}

Rust相关问答推荐

如何在Rust中获得不可辩驳的'if let'模式警告Mutex锁定?""

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

将此字符串转换为由空格字符分隔的空格

如何在tauri—leptos应用程序中监听后端值的变化?""

关联类型(类型参数)命名约定

创建包含缺失值的框架

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

Rust&;Tokio:如何处理更多的信号,而不仅仅是SIGINT,即SIGQUE?

在Rust中判断编译时是否无法访问

Cargo.toml:如何有条件地启用依赖项功能?

Rust 如何将链表推到前面?

无法将`&Vec>`转换为`&[&str]`

Rust:`sort_by` 多个条件,冗长的模式匹配

RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象

使用 serde_json 进一步处理字段

通用函数中的生命周期扣除和borrow (通用测试需要)

TcpStream::connect - 匹配武器具有不兼容的类型

以下打印数组每个元素的 Rust 代码有什么问题?

将 (T, ()) 转换为 T 安全吗?

如何从 Rust 中不同类型的多个部分加入 Path?