当前位置: 首页 > 知识库问答 >
问题:

如何避免模数上的匹配出现“_”情况?

古弘
2023-03-14

这闻起来很难闻:

let millis = time % 1000;
match millis {
    0..=199 => do_something(),
    200..=599 => do_something_else(),
    600..=999 => do_something_altogether_different(),
    _ => panic!("There are only 1,000 ms in a second."),
}

永远不会调用“u”大小写,因为millistime%1000

我如何重写它,使我只有三个分支?

理想情况下,我还想删除199/200, 599/600和999/1000/0的重复。

如果最好的解决方案不是匹配,我很乐意使用其他一些控制结构。

共有3个答案

闻人景澄
2023-03-14

您可以修改其中一个ARM,使编译器理解它包含不可能发生的情况,方法是将其中一个范围设为无界。这可以被视为匹配版本的if链选项:

fn foo(time: u32) {
    let millis = time % 1000;
    match millis {
        0..=199 => todo!(),
        200..=599 => todo!(),
        600.. => todo!(),
    }
}

然而,我只会在代码中选择这个选项,这个代码显然和这个例子一样正确;在更复杂的情况下,我更喜欢带有\u的版本=

岳枫
2023-03-14
匿名用户

如果,我会使用一个简单的,因为每个案例只有一个条件,只有少量案例:

if millis < 200 {
    do_something()
} else if millis < 600 {
    do_something_else()
} else {
    do_something_altogether_different()
}

如果要使用match,也可以在其中使用If-guard:

match millis {
    x if x < 200 => do_something(),
    x if x < 600 => do_something_else(),
    _ => do_something_altogether_different(),
}

两者都删除了199/200。。。

锺宜
2023-03-14

Rust使用类型进行匹配,因此它不知道根据您的逻辑的边界。但你知道。

为了明确起见,您可以使用unreachable

表示无法访问的代码。

这在编译器无法确定某些代码不可访问时非常有用。例如:

匹配武器与保护条件。动态终止的循环。动态终止的迭代器。如果代码不可达的判断证明是不正确的,程序立即以恐慌终止!。

let millis = time % 1000;
match millis {
    0..=199 => do_something(),
    200..=599 => do_something_else(),
    600..=999 => do_something_altogether_different(),
    _ => unreachable!("There are only 1,000 ms in a second."),
}

否则,您可以认为最后一个分支是默认的:

let millis = time % 1000;
match millis {
    0..=199 => do_something(),
    200..=599 => do_something_else(),
    _ => do_something_altogether_different(),
}

 类似资料:
  • 问题内容: 在确定文件是否存在时,使用try语句如何避免“竞争条件”? 我之所以这样问是因为高度支持的答案0)(更新:已删除)似乎暗示使用会创造机会,否则这种机会就不会存在。 给出的示例是: 但与以下内容相比,我不了解如何避免出现竞争状况: 调用如何使攻击者能够处理他们无法完成的文件? 问题答案: 比赛条件,当然,你的程序和文件上运行一些其他的代码之间(竞争状态总是需要至少两个平行的进程或线程,看

  • 问题内容: 我已经阅读了很多有关代码重构和避免if else语句的主题。实际上,我有一堂课,我在使用很多if-else条件。 更多详细信息:我正在使用拉式解析器,并且在我的肥皂响应的每一行上,我都会检查是否有我感兴趣的标签,如果没有,请检查其他标签,等等: 现在,我想使用somethimg,而不是其他条件,但是我不知道是什么。 您能给我一个例子还是一个很好的教程页面? 谢谢。 问题答案: 在这种特

  • 在使用模式匹配时,此示例可能会被讨论为“gotcha”: 这是一个使用结构模式匹配进行意外捕获的示例。它提供了以下意外输出: 同样的问题也以其他形式出现: 在此示例中,需要有括号,。没有它们,它“捕获”并将str内置类型替换为x的值。 是否有防御性编程实践可以帮助避免这些问题并提供早期检测?

  • 在上述情况下,如果用户为空,则给出NPE。如何避免NPE?

  • 问题内容: 我设计了一个简单的函数来返回数学函数,该函数可用于拟合实验数据。这些功能看起来很像以下内容: 不幸的是,我在RunTimeWarnings中遇到了麻烦: 由于值太大或太小。但我无法自行解决此问题。有什么办法可以重新定义我的功能,使其在没有警告的情况下通过? 问题答案: 使用以控制在这种情况下做什么numpy的:http://docs.scipy.org/doc/numpy/refere

  • Lodash castArray函数没有任何特殊之处。有没有什么方法可以在没有任何外部库的情况下,利用最新的语言功能解决这个问题,但时间很短? 如果您不熟悉该任务: 有没有办法在没有类型检查的情况下做到这一点?请注意,我寻找最短的等效物ES6。