我试图创建一个trait
,它 * 返回一个字符串的引用 *。
在一个实现trait的结构中,我持有一个String
。
在另一个实现trait的结构中,我持有一个RefCell<String>
。从这里我可以返回一个Ref<str>
。
我发现的唯一一个可以同时容纳这两种类型的签名如下(A boxed Deref trait
):
trait Get<'a> {
fn get(&'a self) -> Box<dyn Deref<Target=str> + 'a>;
}
个字符
这不仅是令人难以置信的丑陋,而且现在我还需要调用deref()
两次,一次是Box
,一次是trait
。
#[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");
}
型
有没有其他方法可以做到这一点?
Playground
1条答案
按热度按时间dsekswqp1#
您可以引入一个关联类型来用作返回值。
字符串
代码的其余部分可以这样修改。
型
这适用于给定的测试,通常应该足够了,但是如果你想像这个测试一样统一类型:
型
然后你需要重新引入trait对象或枚举。
型
你可以做的另一件事是将
A
和B
的impls改为type Ret<'a> = StrOrRef<'a>
。任何一个都可能比让trait方法返回
Box
更好,因为它允许trait是灵活的。(playground)