【问题标题】:How can I port C++ code that uses the ternary operator to Rust?如何将使用三元运算符的 C++ 代码移植到 Rust?
【发布时间】:2017-12-18 22:41:02
【问题描述】:

如何将此 C++ 代码移植到 Rust:

auto sgnR = (R >= 0.) ? 1. : -1.;

我见过一些带有 match 关键字的示例,但我不明白它是如何工作的。

【问题讨论】:

  • 谷歌“锈三元算子”,你会发现一堆命中。
  • @Baum 这个问题需要同时了解 Rust 和 C++,因此它是极少数应该同时包含两个标签的问题之一。然而,我确实认为它应该出于其他原因而关闭。
  • @Galik Nah,标签用于查找相关内容。没有 C++ 问题的人会想找到这个问题,所以它不应该有标签。这不是一个 C++ 问题,而仅仅是一个生锈的问题。 (另外,我没有得到“它应该因为 other 原因而关闭”部分,这似乎与整个标记问题非常正交。)
  • @BaummitAugen 但是你如何期望一个纯 Rust 程序员从他不理解的语言转换代码?需要一些 C++ 知识。如果人们不想找到这个问题,那么它应该被关闭而不是被错误标记

标签: if-statement rust conditional-operator


【解决方案1】:

从 Rust 1.50 开始,您可以使用 bool::then 来完成同样的事情:

let sgn_r = (r >= 0).then(|| 1).unwrap_or(-1);

请注意,出于可读性原因,通常最好使用常规 if/else 语句,但 bool::then 是一种替代方法,在某些情况下可能会更好。

【讨论】:

    【解决方案2】:

    Rust 没有三元运算符,因为它不是必需的。一切都评估为某个值,if / else 语句也不例外:

    let r = 42.42;
    let sgn_r = if r >= 0. { 1. } else { -1. };
    

    您会注意到,我还将您的变量名称更改为惯用的 Rust。标识符使用snake_case

    不要被 Rust 所拥有的 ? 操作符所迷惑。这是called the "try operator" and is used to propagate errors


    对于这个代码,你可能应该使用f64::signum

    let r = 42.42_f64;
    let sgn_r = r.signum();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-08
      • 2018-06-27
      • 1970-01-01
      • 2021-07-20
      • 2011-07-08
      • 2021-11-16
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多