Rust中当.as_ref()改变类型时,获取Option<T>内部T的引用
如何在Rust中从Option获取引用或使用备用&Url
正确解法
直接使用Option::as_ref()将Option<Url>转换为Option<&Url>,之后就能用unwrap_or指定备用的&Url:
// backup_value: &Url let url = optional_url.as_ref().unwrap_or(backup_value);
或者用match写法更直观:
let url = match optional_url.as_ref() { Some(url) => url, None => backup_value, };
为什么之前的写法失败
1. map搭配url.as_ref()的问题
Url类型实现了AsRef<str>,这会让url.as_ref()返回&str,导致map之后得到的是Option<&str>,和备用值&Url类型不匹配,编译报错。
2. map(|url| &url)的问题
闭包中返回的&url是对闭包临时变量的引用,生命周期仅局限于闭包内部,无法和backup_value的生命周期对齐,编译器会判定引用悬空。
3. 直接match的问题
match optional_url会将内部的Url移动到Some(url)分支中,&url是对这个临时Url的引用,当match结束后该临时值被销毁,引用也就悬空了,违反了Rust的借用规则。
4. 克隆备用值的问题
虽然克隆能解决编译问题,但完全没必要——你只需要一个引用,克隆会带来不必要的性能开销,而且代码不够简洁。
核心原理
Option::as_ref()是专门用来将Option<T>转换为Option<&T>的方法,它不会获取所有权,只是借用内部的值,这样就能保证返回的引用生命周期和原Option<Url>一致,和备用的&Url生命周期匹配,从而避免所有类型和生命周期问题。
内容的提问来源于stack exchange,提问作者2e0byo
相关产品推荐
相关产品推荐

