dco*_*les 11 rust optional-chaining
当反序列化深层嵌套结构(例如,从 JSON)时,必须遍历多种Option类型的情况并不少见。
例如:
let foo = Foo {
x: Some(Bar {
y: Some(Baz {
z: Some(42),
})
})
};
Run Code Online (Sandbox Code Playgroud)
是否有一种惯用的方式来链接 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)();
Run Code Online (Sandbox Code Playgroud)
看起来这个try_block功能可能很合适,但目前还不稳定。
let z = try { foo.x.as_ref()?.y.as_ref()?.z };
Run Code Online (Sandbox Code Playgroud)
正如你所说,这个try块非常适合这个。
同时,您可以利用?在函数中工作的事实,将表达式包装在闭包中并调用它:
let z = (|| foo.x.as_ref()?.y.as_ref()?.z )();
Run Code Online (Sandbox Code Playgroud)
您可以编写一个简单的宏来使其更好一点:
macro_rules! tryit {
($($e: tt)+) => {
(|| { $($e)+ })()
}
}
Run Code Online (Sandbox Code Playgroud)
其工作原理与块基本相同try:
let z = tryit! { foo.x.as_ref()?.y.as_ref()?.z };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1960 次 |
| 最近记录: |