匹配字符串时如何不对"休息案例"做任何事情?

kyc*_*ylt 11 rust

我有一个字符串,我想检查它是分号,逗号还是冒号.如果它不是那些,我不想做任何事情:

match token.as_ref() {
    ";" => semicolons += 1,
    "," => commas += 1,
    ":" => colons += 1,
     _ => println!(""),
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我真的不想打印一堆空行(因为很多令牌都不符合这些标准).

什么是最正确的解决方法?

Ale*_*nov 21

let some_u8_value = 0u8;
match some_u8_value {
    1 => println!("one"),
    3 => println!("three"),
    5 => println!("five"),
    7 => println!("seven"),
    _ => (),
}
Run Code Online (Sandbox Code Playgroud)

()只是单位值,因此在这种_情况下不会发生任何事情.因此,我们可以说我们不想对_占位符之前未列出的所有可能值执行任何操作.

您还可以使用空块表达式{}.

  • @erip Rust有FP功能,但不是FP语言; 副作用很常见.匹配不是"FP的构建块",它只是进行FP核心数据复杂转换的几种工具之一.其他非FP语言因其一般用途而采用了它."不引入副作用"不是"更好的答案"; 事实上,它不是主题.人们在SO上提出问题是因为他们有一些他们试图解决的具体问题,并且告诉他们在这种情况下改变他们的范式是不合适的. (10认同)
  • 我的评论显然是相关的,以上内容均未对此有任何反驳。我的评论很明确,我将不再进一步讨论。 (3认同)
  • 更好的答案是_模式匹配时不要引入副作用_。 (2认同)
  • Rust 中的模式匹配有什么特别之处,这使得那里的副作用比其他任何地方都更不理想? (2认同)
  • 好点子。我会将我的声明修改为_不引入副作用_(如果可以的话)。出于某种原因,这里特别引人注目……也许是因为模式匹配是 FP 的构建块。 (2认同)
  • @erip一般来说,是的,但有时,例如,您想提前返回其中一只手臂,但除此之外什么也不做。我刚刚遇到这样一个案例,它吸引了我来到这里。 (2认同)
  • @sam如果你看看责怪,这个“{}”也曾经是“()”https://github.com/alacritty/alacritty/commit/66d742d0596203af7ca0e5db47c5b5bc1cc18d91,我不知道他们为什么改变它,但应该有没有什么区别。 (2认同)