与此完全相同 question ,我希望函数的返回类型是一个特征,返回值是实现该特征的类型的实例。一个简单的例子:
fn myfunction() -> Box<Printable> {
box TypeB{val: 2} as Box<Printable>
}
如果我没有显式地转换成我的通用特征框,我会得到:
error: mismatched types: expected
Box<Printable>
but foundBox<TypeB>
(expected trait Printable but found struct TypeB)
所以我想知道:
- 如果这是在 Rust 中返回特征类型的正常方式
- 为什么 Rust 编译器无法推断出自动向下转型
有什么想法吗?我使用的是当前的夜间版本的编译器。
最佳答案
是的,像这样的 trait 对象是返回 trait 的正确方法,尽管如果可能的话,返回一个没有 Box
的具体类型会更灵活:该函数的调用者可以 box/如果他们需要的话。如果那不是直接可能的,那么定义并返回一个 enum
可能会起作用。 (装箱和特征对象应该被视为最后的手段:它通常不如其他策略有效。)
不幸的是,隐式强制转换还不能从返回值中推断出来(它们在其他上下文中会这样做,例如 foo(box bar)
将在需要时将该参数强制转换为特征对象);这有望得到修复,但现在需要显式转换。
关于casting - 特征作为函数的返回值,并显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24594024/