rust 是否有一种简洁的方法来检查一个Option是否为None或其Some内容是否为空?[关闭]

nkkqxpd9  于 2023-06-06  发布在  其他
关注(0)|答案(3)|浏览(275)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

6天前关闭
Improve this question
有比下面的代码更简洁的东西吗?

let player_list: Option<Vec<Player>>;

// more code here

if player_list.is_none() || player_list.as_ref().unwrap().is_empty() {
  // do something here if player_list is none or empty
}

我想避免||部分。

mrfwxfqh

mrfwxfqh1#

我假设您可能不希望使用player_list。在这种情况下,用途:

player_list.as_ref().map_or(true, Vec::is_empty)

如果可以使用player_list

player_list.unwrap_or_default().is_empty()
fjaof16o

fjaof16o2#

您可以使用.map_or甚至.map_or_else来完成此操作

if player_list.map_or(true, |player| player.is_empty()) {
   // magic
}

当然,这取决于你是否更容易维护。

q3qa4bjr

q3qa4bjr3#

如果不看代码的整个上下文,很难提出有根据的建议。所以,如果我过早下结论,请提前道歉。
有一个OptionVec有点奇怪。因为Vec已经是一个集合,所以它可以是空的。因此,在某种程度上,None或多或少与Vec()相同。
如果NoneVec()之间没有有意义的差异,那么将player_list转换为Vec可能会更好。
答案中有很好的建议,例如凯撒的回答:

player_list.unwrap_or_default()

如果NoneVec()之间存在有意义的差异。然后,也许有一个具体的类型来表示这些不同的状态会使事情更容易理解。在这种情况下,您可能会吸收代码在新类型中的不同行为方式。
例如:

enum GameStatus {
    LobbyNotOpen,
    LobbyOpen(Vec<Player>),
}

enum TeamRecruitment {
    NotStarted,
    OpenForRecruitment(Vec<Player>),
}

相关问题