Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么我的模式中没有包括'std::i64::MIN..=-1i64'和'1i64..=std::i64::MAX'?_Rust - Fatal编程技术网

Rust 为什么我的模式中没有包括'std::i64::MIN..=-1i64'和'1i64..=std::i64::MAX'?

Rust 为什么我的模式中没有包括'std::i64::MIN..=-1i64'和'1i64..=std::i64::MAX'?,rust,Rust,如何将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(

如何将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);
}
但即使我每晚启用,它仍然建议添加![featureexclusive\u range\u pattern]到要启用的板条箱属性,我不知道在操场上该怎么做。

如果您的目标是尽可能简单地编写f1,那么已经有了一个函数,它叫做i64::signum:

如果你的目标是更一般地写符号比较来做其他事情,我会这样写:

fn sign(x: i64) {
    match x.signum() {
        -1 => println!("negative"),
        0 => println!("zero"),
        1 => println!("positive"),
        _ => unreachable!(),
    }
}
编译器通常可以很好地优化这段代码。

如果您的目标是尽可能简单地编写f1,那么已经有了一个函数,它被称为i64::signum:

如果你的目标是更一般地写符号比较来做其他事情,我会这样写:

fn sign(x: i64) {
    match x.signum() {
        -1 => println!("negative"),
        0 => println!("zero"),
        1 => println!("positive"),
        _ => unreachable!(),
    }
}

编译器通常可以很好地优化此代码。

对于普通模式,rust可以检查匹配臂是否详尽无遗。这是因为普通图案有少量的形式,所有这些形式都被告知如何理解

但你的比赛武器涉及if条件,在这种情况下有时称为后卫。保护中的条件可以具有任意形式。有些对你来说很容易,但是。任何编译器,包括rust的编译器,都无法预测任意条件。这是一个好主意。所以锈不会浪费时间去尝试

在这种特殊情况下,实际上有一种方法可以将防护罩更换为普通模式,这样可以彻底检查锈蚀情况

fn f1(value: i64) -> i64 {
    match value {
        1..=std::i64::MAX => 1,
        0 => 0,
        std::i64::MIN..=-1 => -1,
    }
}
你可以使用半开放式靶场,但它们需要不稳定的锈迹

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

对于普通图案,生锈可以检查匹配臂是否完整。这是因为普通图案有少量的形式,所有这些形式都被告知如何理解

但你的比赛武器涉及if条件,在这种情况下有时称为后卫。保护中的条件可以具有任意形式。有些对你来说很容易,但是。任何编译器,包括rust的编译器,都无法预测任意条件。这是一个好主意。所以锈不会浪费时间去尝试

在这种特殊情况下,实际上有一种方法可以将防护罩更换为普通模式,这样可以彻底检查锈蚀情况

fn f1(value: i64) -> i64 {
    match value {
        1..=std::i64::MAX => 1,
        0 => 0,
        std::i64::MIN..=-1 => -1,
    }
}
你可以使用半开放式靶场,但它们需要不稳定的锈迹

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

如果num<0=>-1,则可以将num更改为=>-1,因为前面的两个条件已经确保它为负值。因为模式保护是一个无用的功能@loganfsmyth,谢谢,这很有效。但它感觉像是针对语言/编译器的一种变通方法。我的意思是,我的逻辑本身是详尽的,但它们没有被检查……@Stargateur,我现在也有同样的感觉。我只是希望match做详尽的检查,但是一旦你有了match guard,你就必须做一些事情来有效地捕获所有。num如果num<0=>-1,可以更改为=>-1,因为前面的两个条件已经确保它是负的。因为pattern guard是一个无用的特性@loganfsmyth,谢谢,这很有效。但它感觉像是针对语言/编译器的一种变通方法。我的意思是,我的逻辑本身是详尽的,但它们没有被检查……@Stargateur,我现在也有同样的感觉。我只是希望对手能做详尽的检查,但一旦你们有了比赛后卫,你们就必须做一些事情来有效地抓住一切。谢谢,我感到惊讶的是,当比赛后卫存在时,并没有考虑到这只手臂的详尽性。我在书中找不到这个。你知道这方面的任何文件吗?是的,学习材料可以明确指出这一点。但这并不是关于文档的问题。有了一点理论知识,这一点也不奇怪。事实上,相反的情况会令人惊讶。我把答案编辑得更清楚了。谢谢,我很惊讶当比赛中有后卫的时候,那只手臂不会被考虑到太累。我在书中找不到这个。你知道这方面的任何文件吗?是的,学习材料可以明确指出这一点。但这并不是关于文档的问题。有了一点理论知识,这一点也不奇怪。事实上,相反的情况会令人惊讶。我对答案进行了编辑,使其更加明确。无论如何,谢谢你的提示。我更困惑的是,为什么它抱怨我的模式不是详尽无遗的,而它们在我看来显然是详尽无遗的。无论如何,谢谢你的提示。我更困惑的是,为什么它抱怨我的模式不是详尽无遗的,而它们在我看来显然是详尽无遗的。