gpt4 book ai didi

rust - 为什么 `std::i64::MIN..=-1i64`和 `1i64..=std::i64::MAX`没有包含在我的模式中?

转载 作者:行者123 更新时间:2023-12-03 11:34:09 25 4
gpt4 key购买 nike

如何将i64变量与正,零和负模式匹配?

假设我具有以下函数f1,我想进行匹配,对于负输入,返回-1,对于正输入,返回1,对于0,返回0。

fn f1(value: i64) -> i64 {
match value {
num if num > 0 => 1,
0 => 0,
num if num < 0 => -1,
}
}

#[test]
fn test_f1() {
assert_eq!(f1(-5), -1);
}

游乐场链接是 here

但是它提示“错误[E0004]:非穷尽模式:没有覆盖 std::i64::MIN..=-1i641i64..=std::i64::MAX”。正确的模式是什么?

请随意提出更好的方式来编写模式,我希望将其写在如下范围内:
fn f1(value: i64) -> i64 {
match value {
1.. => 1,
0 => 0,
..=-1 => -1,
}
}

但是,即使我每晚启用,它仍然建议“将 #![feature(exclusive_range_pattern)]添加到要启用的 crate 属性中”,我不确定在Playground中该如何做。

最佳答案

对于普通花纹,使用rust 可以检查火柴臂是否穷举。这是因为普通图案的形式很少,所有 rust 都已被告知如何理解。

但是您的比赛武器涉及if条件,在这种情况下有时也称为守卫。守卫中的条件可以具有任意形式。有些看起来对您来说很容易,但是others are hard。包括rust在内的编译器都无法预测任意条件。这是mathematical fact。因此,使用rust 不会浪费时间。

在这种特殊情况下,实际上有一种方法可以将防护罩替换为普通花纹,这种 rust 可以彻底检查。

fn f1(value: i64) -> i64 {
match value {
1..=std::i64::MAX => 1,
0 => 0,
std::i64::MIN..=-1 => -1,
}
}

您可以使用半开范围,但它们需要不稳定的 rust 。
fn f1(value: i64) -> i64 {
match value {
1.. => 1,
0 => 0,
..=-1 => -1,
}
}

关于rust - 为什么 `std::i64::MIN..=-1i64`和 `1i64..=std::i64::MAX`没有包含在我的模式中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62095772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com