如何访问嵌套&Box中的String?编译报错求助
问题分析与解决
你的代码中,let b = &***a;报错的核心原因是:***a会生成一个临时的Box<String>实例,当你取这个临时值的引用时,临时值会在当前语句执行完毕后立即被销毁,导致引用悬空,触发编译器的借用检查错误。
正确的解决方案
以下几种方式都可以获取到目标字符串:
方式1:利用Rust的自动解引用特性(最简洁)
Rust会自动处理多层智能指针的解引用,直接将a转为&str类型即可:
fn main() { let a = &Box::new(&Box::new(String::from("Rust"))); let b: &str = a; println!("{}", b); // 输出Rust }
方式2:显式解引用并转为&str
如果你想显式控制解引用过程,可以直接将结果转为&str,避免临时Box的产生:
fn main() { let a = &Box::new(&Box::new(String::from("Rust"))); let b = &***a as &str; println!("{}", b); }
或者更清晰地调用as_str()方法:
fn main() { let a = &Box::new(&Box::new(String::from("Rust"))); let b = (**a).as_str(); println!("{}", b); }
方式3:获取String类型(而非引用)
如果需要拥有字符串的所有权,可以克隆临时值:
fn main() { let a = &Box::new(&Box::new(String::from("Rust"))); let b = (***a).clone(); println!("{}", b); }
内容的提问来源于stack exchange,提问作者Samsul Islam
相关产品推荐
相关产品推荐

