gpt4 book ai didi

rust - 是否有推荐的方法将 `if let` 与浮点值一起使用?

转载 作者:行者123 更新时间:2023-12-03 11:24:30 26 4
gpt4 key购买 nike

我正在做一些参数解析,最终我得到了一个 Option<f64> 的值。最初是 None ,但可以是 Some(n)如果用户通过程序-g n .但是,如果用户说 -g 0我最终得到一个 Some(0.0)我想翻译成 None .所以我这样做:

if let Some(0.0) = config.opt_value {
config.opt_value = None;
}

这看起来很简单,但是编译器给了我一个警告,我引用了它:

warning: floating-point types cannot be used in patterns
--> src/lib.rs:2:17
|
2 | if let Some(0.0) = config.opt_value {
| ^^^
|
= note: `#[warn(illegal_floating_point_literal_pattern)]` on by default
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #41620 <https://github.com/rust-lang/rust/issues/41620>

此消息将我定向至 the Rust tracking issue , 指的是 Rust RFC 1445: Restrict constants in patterns .有一个很长的讨论,但我们应该如何修复警告的方式并不多。 RFC 提出使用 match arm guards 对浮点值进行定期比较:

match value { n if n == 0.0 => { /* whatever */ } }

这在 if let 中不起作用(所以对我来说没有 if let Some(n) if n == 0.0 { /* whatever */ })。

我设法想出了

match config.opt_value {
Some(n) if n == 0.0 => { config.opt_value = None },
_ => {}
};

这就像罪恶一样丑陋,但会完成工作。

有没有推荐的使用方式 if let关于浮点类型以响应上述警告,还是我们自己?

最佳答案

我会用 Option::map_or (或等效方法):

if config.opt_value.map_or(false, |v| v == 0.0)

对于更广泛的情况,我会使用 Option::filter
let value = config.opt_value.filter(|&v| v != 0.0);

也可以看看:
  • What Every Programmer Should Know About Floating-Point Arithmetic: Comparison
  • Alternatives to matching floating points
  • 关于rust - 是否有推荐的方法将 `if let` 与浮点值一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60533471/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com