【问题标题】:Absolute value function in RustRust 中的绝对值函数
【发布时间】:2017-08-27 07:40:45
【问题描述】:

在这个基本的 Rust 程序中,一个函数计算一个整数的绝对值,而 main() 帮助完成一个带有结果的语句:

fn main() {
    let value = abs(-4);
    println!("{}.", value);
}

fn abs(x: i32) -> i32 {
    print!("The abs value of {} is ", x);

    if x > 0 {
        return x;
    } else {
        -x
    }
}

有没有办法将整个语句“...的绝对值是...”正确打印到 abs() 函数中?我尝试使用

失败
println!("The abs value of {} is {} ", x, x);

这总是打印 x 参数的值(例如 -4、-4),所以它不正确。

还有

println!("The abs value of {} is {} ", x, abs(x));

但是在这里,出于某种原因,Rust 对递归不满意,在编译时发出警告,然后不运行程序。

【问题讨论】:

    标签: function macros rust absolute-value


    【解决方案1】:

    绝对值法为already defined;你不需要自己实现它

    fn main() {
        let value = abs(-4);
        println!("{}.", value);
    }
    
    fn abs(x: i32) -> i32 {
        let val = x.abs();
        println!("The abs value of {} is {}", x, val);
        val
    }
    

    【讨论】:

      【解决方案2】:

      尝试this 避免递归:

      fn main() {
          let value = abs(-4);
          println!("{}.", value);
      }
      fn abs(x: i32) -> i32 {
          let y = if x >= 0 { x } else { -x };
          println!("The abs value of {} is {} ", x, y);
          y
      }
      

      输出:

      The abs value of -4 is 4
      4.
      

      有用于原始类型的内置 .abs() 方法,例如 i8, i16, i32, i64, i128, f32, 和f64:

      assert_eq!(10i32.abs(), 10);
      assert_eq!((-10i32).abs(), 10);
      

      溢出行为

      i32::min_value() 的绝对值不能表示为 i32,并试图计算它会导致溢出。这 意味着调试模式下的代码将在这种情况下触发恐慌,并且 优化后的代码将毫无恐慌地返回i32::min_value()。

      以下代码将在debug 模式下发生恐慌(并在release 模式下返回-128):

      fn main() {
          let a = -128_i8;
          println!("{}", a); // -128
          let b = a.abs();
          println!("{}", b); // -128
      }
      

      由于abs(-2_147_483_648_i32) 是2_147_483_648_u32,你可以返回u32 而不是i32:

      fn abs(x: i32) -> u32 {
          if x >= 0 {
              x as u32
          } else if x == std::i32::MIN {
              2_147_483_648_u32
          } else {
              -x as u32
          }
      }
      fn main() {
          let value = abs(std::i32::MIN); // i32::min_value() // -2_147_483_648i32
          println!("{}.", value); // 2147483648
      }
      

      Output:

      2147483648
      

      【讨论】:

      • 谢谢,效果很好。此时我可以简单地从 main 调用 abs(-4) 并删除“let value =”和整个“println!” main 中的声明。
      • 是的:fn main() { abs(-4); }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多