当反序列化深度嵌套的结构(例如,从JSON)时,必须遍历多个Option
类型的情况并不少见。
例如:
let foo = Foo {
x: Some(Bar {
y: Some(Baz {
z: Some(42),
})
})
};
有没有一种惯用的方法来链接Option以访问深度嵌套的值?
到目前为止,我已经有了以下代码,但它们都不如其他支持可选链接的语言中的foo.x?.y?.z
那样简洁:
let z = foo.x.as_ref().and_then(|x| x.y.as_ref()).and_then(|y| y.z);
let z = foo.x.as_ref().and_then(|x| x.y.as_ref()?.z);
let z = (|| foo.x.as_ref()?.y.as_ref()?.z)();
看起来try_block
特性可能是一个很好的选择,但是它目前还不稳定。
let z = try { foo.x.as_ref()?.y.as_ref()?.z };
3条答案
按热度按时间0s0u357o1#
正如您所说,
try
块非常适合于此。与此同时,你可以利用
?
在函数中工作的事实,将你的表达式 Package 在闭包中并调用它:你可以写一个简单的宏来使它更好一些:
它的工作原理与
try
块基本相同:qnakjoqk2#
如果你不喜欢立即调用闭包,另一个选择是使用类似
map_for
或mdo
的crate。免责声明:我写的
map_for
板条箱。ekqde3dh3#
另一种选择是对
if let
使用重构: