1

如果该索引处没有任何内容但该索引仍然存在,我想使用Vec.last()返回 a的事实。None问题是我找不到将结果与 a whileor中的任何内容进行比较的方法if。但是,如果我使用match,我可以比较它,尽管这似乎比使用while循环效率低。有没有办法在一个if或一个while循环中比较它?

这是我正在尝试做的,但这是无效的,因为据我所知,self.particles.last() == None您无法将其与其他事物进行比较NoneNone

while vec.last() == None {
    num += 1;
}
4

2 回答 2

5

我会使用Option::is_none

while vec.last().is_none() {
    ...
}

但这很无聊。我们是来学习的。也许有一个令人费解的、难以阅读的选项,我们可以在其中展示我们的 Rust 肌肉?碰巧,有!让我们看一下我最喜欢的 Rust 功能之一,模式匹配。

那是什么?好吧,通常你会写这样的东西,只要我们得到Some项目并同时将项目绑定到一个变量,它就会循环:

while let Some(elem) = vec.last() {
    ...
}

Some(elem)是一种模式。事实证明,它None填补了相同的句法角色。这是一种模式,尽管没有变量:

while let None = vec.last() {
    ...
}

我承认let没有变量看起来很奇怪,它看起来像是None在左边有向后的,但它有效。

(另外,我应该指出,如果你不修改,这将是一个无限循环vec。)

于 2021-12-02T04:54:57.073 回答
3

如果该索引处没有任何内容但该索引仍然存在,我想使用Vec.last()返回 a的事实。None

您似乎对Vec::last. None如果“该索引仍然存在”(无论这意味着什么),它绝对不会返回。None如果 vec 为空,它将返回,仅此而已。

所以你的循环要么永远不会执行,要么永远循环。

这就是我想要做的,但是 self.particles.last() == None 是无效的,因为据我所知,除了 None 之外,您无法将事物与 None 进行比较。

while vec.last() == None {
    num += 1;
}

不?问题可能Option<T>是如果是:httpsPartialEq : //play.rust-lang.org/ ?version=stable&mode=debug&edition=2021&gist=00f4ea97a0fad1cd74ef3b6ac6b74dc8TPartialEq

#[derive(PartialEq, Eq)]
struct Equatable;
struct NonEquatable;
fn main() {
    // compiles fine
    println!("{}", None == Some(Equatable));
    // can't compile
    // println!("{}", None == Some(NonEquatable));
}

虽然这显然不是正常的方法,但您通常会使用Option::is_none,可能matches!在极少数情况下(但对于没有谓词的枚举来说更是如此)。

于 2021-12-02T07:01:47.857 回答