【问题标题】:Compare String Length in Rust [closed]比较 Rust 中的字符串长度 [关闭]
【发布时间】:2020-02-04 17:23:57
【问题描述】:

在 Rust 中比较字符串长度的惯用方法是什么,考虑到字符串长度相等的情况?

lifetimes part of the Rust book 中有一段代码,但如果给定的字符串长度相等,它只会返回后一个字符串:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

已经指出.len() 计算字节而不是Unicode 字符。所需的答案应该包括一个函数,该函数在字符串之一在 Unicode 字符方面更长的情况下返回最长的字符串;或其他字符串长度相等的情况。

【问题讨论】:

  • 真的有必要问如何比较两个整数吗?字符串的“长度”很少是有趣的信息。
  • 根据您的自我回答,我认为这个问题与Can I use '<' and '>' in match? 重复(阅读所有答案)。但是,我不知道我怎么能从单独阅读问题中弄清楚这一点,所以我投票“不清楚”。
  • 如果您对字符数感兴趣,例如,您可以比较 a.chars().count()b.chars().count(),或者,如果您的长度可能非常不同,请使用 this
  • 问题询问如何比较两个字符串的长度,然后提供一段代码来做这件事。如果你自己没有回答,潜在的回答者怎么可能猜到你想要什么答案?您可以编辑问题以更明确地说明代码中缺少的内容吗? “考虑到字符串长度相等的情况”可以通过“使用&gt;= 而不是&gt;”来回答是合乎逻辑的——这就是我最初假设的意思。

标签: rust


【解决方案1】:
use std::cmp::Ordering;

fn longest<'a>(a: &'a str, b: &'a str) -> Option<&'a str> {
  match a.chars().count().cmp(&b.chars().count()) {
    Ordering::Equal => None,
    Ordering::Greater => Some(a),
    _ => Some(b),
  }
}

【讨论】:

  • 请注意,由于.len() 是以字节为单位的长度,"ƒoo".len() == 4"foo".len() == 3
  • @user2722968 有什么更好的选择?
  • @Stargateur 真实,抱歉,已编辑。
  • 刚刚改用.chars().count()现在也
  • 使用 UnicodeSegmentation::graphemes() 代替 chars() 来自 unicode-segmentation 板条箱,如果你想计算字素(视觉上不同的字符)而不是 Unicode 标量值。例如,表情符号通常由多个 Unicode 标量值组成。
猜你喜欢
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 2022-11-15
  • 2016-02-04
  • 2018-05-11
  • 1970-01-01
相关资源
最近更新 更多