是否存在类似try操作符的返回首个Some的惰性求值实现方式?
实现惰性求值的
return_first_some_or_none!宏 完全可以实现,而且能完美保留你需要的惰性求值特性。直接定义如下宏即可:
macro_rules! return_first_some_or_none { ($($expr:expr),* $(,)?) => { $( if let Some(x) = $expr { return Some(x); } )* None }; }
用法说明
你可以像示例里那样调用:
return_first_some_or_none!( foo(), bar(), );
惰性求值的保证
这个宏会把传入的每个表达式逐个展开成独立的if let分支,和你原来的手写代码逻辑完全一致。只要前面的表达式返回Some,代码就会直接return跳出,后面的表达式根本不会被执行,完全符合惰性求值的要求。
另外,宏定义里的$(,)?)是为了兼容最后一个参数后加逗号的写法,和你的示例写法匹配。
内容的提问来源于stack exchange,提问作者ajp
相关产品推荐
相关产品推荐

