如何在Rust的trait方法中返回&str或Ref<str>?
优化返回字符串引用的Trait实现方案咨询
我尝试创建一个返回字符串引用的trait,具体需求:
- 结构体A持有
String,实现该trait后可返回&str; - 结构体B持有
RefCell<String>,实现该trait后可返回Ref<str>。
目前我找到的唯一能兼容这两种类型的签名,是使用装箱的Deref trait,定义如下:
trait Get<'a> { fn get(&'a self) -> Box<dyn Deref<Target=str> + 'a>; }
对应的结构体实现代码:
struct A { name: String, } impl<'a> Get<'a> for A { fn get(&'a self) -> Box<dyn Deref<Target=str> + 'a> { Box::new(self.name.as_str()) } } struct B { name: RefCell<String>, } impl<'a> Get<'a> for B { fn get(&'a self) -> Box<dyn Deref<Target=str> + 'a> { let ret = Ref::map(self.name.borrow(), |it| it.as_str()); Box::new(ret) } }
但这种写法十分繁琐,调用时还需要两次deref()操作:
#[test] fn test_ref() { let a = A { name: "Woolly".to_string() }; let b = B { name: RefCell::new("Woolly".to_string()) }; assert_eq!(a.get().deref().deref(), "Woolly"); assert_eq!(b.get().deref().deref(), "Woolly"); }
请问是否存在更简洁、更优的实现方式?
内容的提问来源于stack exchange,提问作者Steven Spungin
相关产品推荐
相关产品推荐

