[英]How to check if a value in a Vec is None?
如果該索引處沒有任何內容但該索引仍然存在,我想使用Vec.last()
返回None
的事實。 問題是我找不到將結果與一段while
內的任何內容或if
進行比較的方法。 但是,如果我使用match
,我可以比較它,盡管這似乎比使用while
循環效率低。 有沒有辦法在if
或while
循環中比較它?
這就是我想要做的,但是self.particles.last() == None
是無效的,因為據我所知,除了None
之外,您無法將事物與None
進行比較。
while vec.last() == None {
num += 1;
}
如果該索引處沒有任何內容但該索引仍然存在,我想使用
Vec.last()
返回None
的事實。
您似乎對Vec::last
的行為感到非常困惑。 如果“該索引仍然存在”(無論這意味着什么),它絕對不會返回None
。 如果 vec 為空,它將返回None
,僅此而已。
所以你的循環要么永遠不會執行,要么永遠循環。
這就是我想要做的,但是 self.particles.last() == None 是無效的,因為據我所知,除了 None 之外,您無法將事物與 None 進行比較。
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
,可能matches!
在極少數情況下(但對於沒有謂詞的枚舉來說更是如此)。
您可以使用模式匹配語法。 那是什么? 好吧,通常你會寫這樣的東西來循環,只要你得到Some
值並同時將項目綁定到一個變量:
while let Some(elem) = vec.last() {
...
}
Some(elem)
是一種模式。 事實證明,您可以將其替換為沒有變量的模式: None
。
while let None = vec.last() {
...
}
我承認let
沒有變量看起來很奇怪,看起來左邊有None
是向后的,但它有效。
(另外,我應該指出,如果您不修改vec
,這將是一個無限循環,是嗎?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.