【问题标题】:How do I convert a boolean to an integer in Rust?如何在 Rust 中将布尔值转换为整数?
【发布时间】:2019-04-01 18:41:16
【问题描述】:

如何在 Rust 中将布尔值转换为整数?如,true 变为 1,false 变为 0。

【问题讨论】:

  • @Stargateur 我将它们打印到屏幕上进行调试,在我的情况下打印出 1 和 0 比 truefalse 更方便。
  • 有时在算术中很有用,例如pub fn calculateprice(num : i32) -> i32 { return ((num > 40) as i32 * num) + num; }

标签: rust


【解决方案1】:

投射它:

fn main() {
    println!("{}", true as i32)
}

【讨论】:

    【解决方案2】:

    Rust 中的布尔值是 guaranteed to be 1 or 0:

    bool 代表一个值,它只能是truefalse。如果将bool 转换为整数,true 将为 1,false 将为 0。

    一个布尔值,既不是 0 也不是 1undefined behavior

    布尔值中的 false (0) 或 true (1) 以外的值。

    因此,您可以将其转换为原语:

    assert_eq!(0, false as i32);
    assert_eq!(1, true as i32);
    

    【讨论】:

      【解决方案3】:

      你可以使用.into():

      let a = true;
      let b: i32 = a.into();
      println!("{}", b); // 1
      
      let z: isize = false.into();
      println!("{}", z); // 0
      

      playground

      【讨论】:

        【解决方案4】:

        使用if 声明:

        if some_boolean { 1 } else { 0 }
        

        另见:

        【讨论】:

        • A simple benchmark 表明这比其他答案快 20%。
        • @Stein 我认为您的链接已过时。
        • @Stein Current nightly 似乎为is_some_asis_some_if 生成相同的代码:rust.godbolt.org/z/edcKef
        • @SolomonUcko 不完全是,看来。今天的基准仍然报告相同的差异(无论名称和文件位置如何,这可能会影响对齐)。当我将您非常有用的godbolt 链接中的-Ocargo bench 提供的-C opt-level=3 交换时,它确实报告了装配差异。
        • 嗯,真的,很有趣!这是一个较小的示例:rust.godbolt.org/z/7MM49d。我不完全确定is_some_if 的控制流是怎么回事。
        猜你喜欢
        • 1970-01-01
        • 2016-11-28
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 2012-02-25
        相关资源
        最近更新 更多