You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:52:30