从函数返回特征和显式转换

5

和这个问题一样,我希望函数的返回类型是一个特质(trait),而返回值是实现该特质的类型的实例。下面是一个简单的例子:

fn myfunction() -> Box<Printable> {
    box TypeB{val: 2} as Box<Printable>
}

如果我不明确将我的通用特征转换为一个盒子,我会得到以下错误信息:
“错误:类型不匹配:期望 `Box` 但发现 `Box`(期望特征 Printable 但发现结构体 TypeB)”
因此我想知道:
1. 在 Rust 中返回 trait 类型是否是正常的处理方式? 2. 为什么 Rust 编译器无法自动下转换? 你有任何想法吗?我正在使用编译器的最新版本。
1个回答

2
是的,像这样的特质对象是返回特质的正确方式,不过如果可能的话,返回一个没有 Box 的具体类型更加灵活:该函数的调用者可以在需要时进行包装/转换。如果直接不可能实现这一点,定义并返回一个 enum 可能会起作用。(将对象放入 Box 和特质对象应被视为最后的手段:它通常比其他策略效率低。)
不幸的是,隐式强制转换尚不能从返回值中推断(在其他上下文中,如 foo(box bar) 如果需要,该参数将强制转换为特质对象);这将有望得到解决,但现在需要显式转换。

谢谢。我的测试想法是编写一个工厂函数(例如:实现到DB的抽象层)。 - Fabimaru
@Fabimaru,啊,这听起来可能适合使用特质对象。 - huon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接