Rust中?运算符是否自动释放值?借用时如何防止值被丢弃?
问题解答
关于?运算符的疑问
?运算符并不会主动释放值,它的作用只是传递错误:如果表达式返回Err,就直接从当前函数返回这个错误;如果是Ok(v),就提取出v继续执行。你的问题和?无关,核心是链式调用产生的临时对象生命周期不足。
报错原因分析
看你的代码:
let main_element = driver.find_element(By::Id("sb_form_c"))?.find_element(By::Id("b_searchBoxForm"))?;
这里driver.find_element(...)会返回一个临时的WebElement对象,紧接着调用它的find_element方法得到最终的main_element。但这个临时的父元素会在当前语句结束时被自动销毁,而main_element作为子元素,内部持有对父元素的引用(或依赖父元素的存活状态),后续使用main_element时,父元素已经不存在,就触发了生命周期错误。
同理第11行的链式调用也是一样的问题:临时的父元素被提前销毁,子元素的引用失效。
修复方案
把链式调用拆分成单独的let绑定,让每个中间元素都拥有独立的生命周期,直到不再被使用:
use thirtyfour_sync::{error::WebDriverError, Keys::Enter, prelude::*}; fn main() -> Result<(), WebDriverError> { let browser = DesiredCapabilities::edge(); let driver = WebDriver::new("http://localhost:4444", &browser)?; driver.get("https://www.bing.com")?; // 拆分链式调用,保留中间元素 let sb_form_c = driver.find_element(By::Id("sb_form_c"))?; let main_element = sb_form_c.find_element(By::Id("b_searchBoxForm"))?; let sb_form_q = main_element.find_element(By::Id("sb_form_q"))?; let sec_element = sb_form_q.find_element(By::Id("b_searchbox"))?; sec_element.send_keys("ksiOlajidebt")?; sec_element.send_keys(Enter)?; Ok(()) }
这样每个中间元素(sb_form_c、sb_form_q)都会存活到函数结束(或超出作用域),子元素的引用就不会因为父元素提前销毁而失效。
总结
?不负责释放值,错误根源是临时对象生命周期过短- 解决这类生命周期问题的核心是:避免在单个语句中链式调用产生依赖父对象的子对象,通过单独的
let绑定延长父对象的生命周期
内容的提问来源于stack exchange,提问作者user17250991
相关产品推荐
相关产品推荐

