如何检查 Vec 中的值是否为 None?
How to check if a value in a Vec is None?
我想使用 Vec.last()
returns a None
如果该索引处没有任何内容但该索引仍然存在。问题是我找不到将结果与 while
或 if
内的任何内容进行比较的方法。但是,如果我使用 match
,我可以比较它,尽管这似乎不如使用 while
循环有效。有没有办法在 if
或 while
循环中比较它?
这就是我想要做的,但是 self.particles.last() == None
是无效的,因为据我所知,除了 None
之外,您无法将其与 None
进行比较。
while vec.last() == None {
num += 1;
}
我会用 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
,这将是一个无限循环。)
I would like to use the fact that Vec.last()
returns a None
if there is nothing at that index but that index still exists.
您似乎对 Vec::last
的行为很困惑。如果“该索引仍然存在”(无论那是什么意思),它绝对不会 return None
。如果vec为空,它会return None
,就这样。
所以你的循环要么永远不会执行,要么永远循环下去。
This is what I'm trying to do, but the self.particles.last() == None is invalid since you can't compare things to None except None as far as I can tell.
while vec.last() == None {
num += 1;
}
没有?问题可能是 Option<T>
是 PartialEq
当且仅当 T
是 PartialEq
:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=00f4ea97a0fad1cd74ef3b6ac6b74dc8
#[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
, possibly matches!
(但对于没有谓词的枚举更是如此)。
我想使用 Vec.last()
returns a None
如果该索引处没有任何内容但该索引仍然存在。问题是我找不到将结果与 while
或 if
内的任何内容进行比较的方法。但是,如果我使用 match
,我可以比较它,尽管这似乎不如使用 while
循环有效。有没有办法在 if
或 while
循环中比较它?
这就是我想要做的,但是 self.particles.last() == None
是无效的,因为据我所知,除了 None
之外,您无法将其与 None
进行比较。
while vec.last() == None {
num += 1;
}
我会用 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
,这将是一个无限循环。)
I would like to use the fact that
Vec.last()
returns aNone
if there is nothing at that index but that index still exists.
您似乎对 Vec::last
的行为很困惑。如果“该索引仍然存在”(无论那是什么意思),它绝对不会 return None
。如果vec为空,它会return None
,就这样。
所以你的循环要么永远不会执行,要么永远循环下去。
This is what I'm trying to do, but the self.particles.last() == None is invalid since you can't compare things to None except None as far as I can tell.
while vec.last() == None { num += 1; }
没有?问题可能是 Option<T>
是 PartialEq
当且仅当 T
是 PartialEq
:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=00f4ea97a0fad1cd74ef3b6ac6b74dc8
#[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
, possibly matches!
(但对于没有谓词的枚举更是如此)。