Eu encontrei vários casos semelhantes a este:
if let Some(x) = formula_chars.peek() {
if x.is_lowercase() {
todo!()
}
}
onde eu gostaria que uma expressão fosse avaliada como falsa se Option
for None
alguma operação na Some
variante (neste caso is_lowercase()
) retorna falso. No entanto, a única maneira que encontrei de fazer isso é usando if
instruções aninhadas conforme mostrado acima. Existe alguma maneira de fazer isso com uma única expressão? de preferência algo parecido com o código abaixo:
nota: o código abaixo não funciona, é apenas para ilustrar o comportamento desejado
if formula_chars.peek().unwrap_or(false).is_lowercase() {
todo!()
}
PS, neste caso específico, eu sei que poderia unwrap_or
usar apenas um caractere não minúsculo, por exemplo
if formula_chars.peek().unwrap_or('_').is_lowercase() {
todo!()
}
mas estou procurando uma solução mais geral (e de preferência menos complicada)
Você pode usar
Option::is_some_and
:Em vez de definir um lambda que delega imediatamente para outra função, acho um pouco mais ergonômico passar a função delegada como uma expressão de caminho:
No entanto, a expressão de chamada de método usada no lambda executa auto-deref no receptor
x
(se necessário), mas isso não acontece se a função for passada como uma expressão de caminho . Portanto, como neste casochar::is_lowercase
leva umchar
not&char
, se você tiver umOption<&char>
você pode ligar primeiroOption::copied
:É apenas gosto pessoal. YMMV.
Algumas outras opções:
map_or()
:map()
entãounwrap_or()
, algumas pessoas preferem isso amap_or()
:match
:match
:Você provavelmente deveria preferir
is_some_and()
, é o combinador mais limpo e específico, mas pode ser útil em outros cenários.