Rust:如何在模式匹配中从Box<T>获取&T?Box<str>转&str方法
从Box中通过模式匹配获取&T的方法
当然可以,针对你的需求,有几种简洁的方式,不用每次手动调用.as_ref():
单一Box的场景
针对你给出的示例代码,有两种直接的写法:
方式1:利用Deref自动解引用
因为Box<T>实现了Deref<Target=T>,所以可以通过&*boxed直接得到&str:
fn takes_str_ref(_: &str) {} fn example(boxed: Box<str>) { let inner = &*boxed; takes_str_ref(inner); }
方式2:模式匹配中用ref绑定引用
在赋值时用ref关键字,直接绑定到Box<str>内部的引用:
fn takes_str_ref(_: &str) {} fn example(boxed: Box<str>) { let ref inner = boxed; takes_str_ref(inner); }
包含多个Box的结构体场景
这正是ref关键字发挥优势的地方,一次解构就能把所有Box<str>字段绑定成&str,完全不用重复调用.as_ref():
fn takes_str_ref(_: &str) {} struct Data { title: Box<str>, content: Box<str>, author: Box<str>, } fn process_data(data: Data) { // 解构时给每个字段加上ref,直接得到&str引用 let Data { ref title, ref content, ref author, } = data; takes_str_ref(title); takes_str_ref(content); takes_str_ref(author); }
补充:如果处理的是结构体引用
如果你拿到的是结构体的引用(而非所有权),解构时甚至可以省略ref,因为从引用中解构出的字段自动是对应类型的引用,再加上Box<T>的自动Deref,直接传给需要&str的函数即可:
fn process_data_ref(data: &Data) { let Data { title, content, author } = data; // title、content、author自动是&Box<str>,会自动Deref为&str takes_str_ref(title); takes_str_ref(content); takes_str_ref(author); }
原理说明:ref关键字在模式匹配中的作用是绑定到值的引用而非获取所有权,刚好匹配你从Box<T>中获取&T的需求;而Box<T>的Deref实现则让编译器可以自动把&Box<str>转换为&str,进一步简化了代码。
内容的提问来源于stack exchange,提问作者kalkronline
相关产品推荐
相关产品推荐

