问询:Rust中无需手动临时绑定延长临时值生命周期的方法
解决方案
Rust目前没有你设想的匿名绑定语法,但可以通过自定义宏或闭包实现类似效果,无需手动编写显式临时绑定,也不会污染当前命名空间。
方法一:自定义宏
可以写一个宏,在内部创建临时变量存储自有值,再返回所需的引用:
macro_rules! retain_and_ref { ($value:expr, $method:ident) => {{ let temp = $value; temp.$method() }}; }
使用示例:
fn main() { let s = retain_and_ref!(String::new(), as_str); println!("{}", s); }
宏内部的temp变量会将String实例的生命周期延长到与返回的引用一致,避免了临时值提前销毁的问题,且外部无法访问temp,不会污染命名空间。
方法二:闭包封装
利用闭包的作用域来隐藏临时绑定,效果和手动绑定一致但更简洁:
fn main() { let s = (|| { let temp = String::new(); temp.as_str() })(); println!("{}", s); }
闭包执行时创建的temp变量,其生命周期会覆盖到返回的引用,外部同样看不到这个临时变量。
补充说明
Rust中临时值的默认生命周期仅到当前语句结束,链式调用String::new().as_str()时,临时String实例会在let s = ...;语句结束后立即销毁,导致as_str()返回的引用悬空,触发编译器错误。上述两种方法本质都是通过内部绑定,将临时值的生命周期延长到与引用的生命周期匹配,从而解决问题。
内容的提问来源于stack exchange,提问作者TSK
相关产品推荐
相关产品推荐

