gpt4 book ai didi

enums - 带有 if let 枚举匹配的条件编译,其中包含一个项目

转载 作者:行者123 更新时间:2023-11-29 08:08:40 26 4
gpt4 key购买 nike

我有以下枚举:

pub enum Game {
Match(GameWorker),
#[cfg(feature = "cups")]
Cup(CupWorker),
}

因此,如果禁用了 cups 功能,则此 enum 包含一项。下面带有 match 的代码编译正常,但在我使用 if let 匹配此 enum 的地方出现错误:

工作匹配:

fn clear(&mut self, silent: bool) {
match *self {
Game::Match(ref mut gm) => gm.clear(silent),
#[cfg(feature = "cups")]
Game::Cup(ref mut c) => c.clear(silent),
}
}

if let 导致编译错误:

let m: &mut Game = Game::Match(...);
if let Game::Match(ref mut gamematch) = *m {
// ...
}

错误:

error[E0162]: irrefutable if-let pattern
--> src/game.rs:436:32
|
436 | if let Game::Match(ref mut gamematch) = *m {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ irrefutable pattern

Minimal example

有没有办法允许这样的if let?我喜欢这种结构,但不知为什么不允许使用它,我不明白为什么。如上所示,match 构造在相同情况下工作正常。在我个人看来,这里应该是一个可静音的 warning 而不是 error

最佳答案

if let 需要一个可反驳的模式,类似于 if 需要一个 bool。你不能写 if () { something },即使 () 在某种意义上是“有效的”。如果您有 if () {} else { something_else },则静态地知道 else 不会发生。

可以说 if true { something } 也是静态已知的,但有一个区别:条件是一个 bool,它有两个值,所以即使你静态知道值,该类型仍然提供多种变体。

if let 是一样的,但是你可以使用用户定义的类型而不只是 bool。如果你的枚举有多个变体,你不能静态地决定 if let 总是被采用。如果枚举只有一个变体,您就知道 if 条件始终为真,因此即使您有一个 else 分支,它的存在也没有任何意义。

关于enums - 带有 if let 枚举匹配的条件编译,其中包含一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43067620/

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