rust - 是否有从 Rust 的 Ordering::* 到整数的内置转换?

标签 rust

要根据某个值是低于还是高于某个其他值来增加或减少某些东西,我可以这样做:

if destination > self.position {
    self.position += 1;
} else if destination < self.position {
    self.position -= 1;
}

或者这个:

self.position += match self.position.cmp(&destination) {
    Ordering::Less => {
        1
    }
    Ordering::Greater => {
        -1
    }
    Ordering::Equal => {
        0
    }
}

后者在 IMO 中更清晰,但更冗长。有没有办法将这些 Ordering 值转换为整数 (-1, 0, 1),类似于 PHP's spaceship operator ,或者以其他方式减少这段代码的冗长程度?

最佳答案

是的,您可以将它们转换为有符号整数(可以在 the source of cmp::Ordering 中验证):

use std::cmp::Ordering;

fn main() {
    println!("{}", Ordering::Less as i8);    // -1
    println!("{}", Ordering::Equal as i32);   // 0
    println!("{}", Ordering::Greater as i64); // 1
}

在您的情况下,可以按如下方式使用:

self.position -= self.position.cmp(&destination) as i8; // or a different, more suitable signed integer

关于rust - 是否有从 Rust 的 Ordering::* 到整数的内置转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47767954/

相关文章:

xml - 解析文件返回错误 "thread ' main' paniced"

io - 我如何在 Rust 中一次读取和处理文件的 N 行?

rust - 如何使用 'static lifetime for a struct with lifetime ' a 实现特征?

rust - 你如何处理 "could not parse code block as Rust code"rustdoc 警告?

rust - 有朝一日,Rust 可以在对象 move 期间优化掉按位复制吗?

memory-management - 发生运行时 panic 时,堆栈/堆分配的类型会发生什么情况?

sorting - 如何检查切片是否已排序?

rust - 即使src/main.rs可用, cargo 也不会生成

rust - 匹配元组作为映射的输入

rust - 无法返回 Vec<Box<dyn Fn(f32) -> f32>>