将特性作为函数的返回值并进行显式转换

Fab*_*aru 5 casting traits rust

与这个问题完全一样,我希望函数的返回类型是特征,返回值是实现该特征的类型的实例。一个简单的例子:

fn myfunction() -> Box<Printable> {
    box TypeB{val: 2} as Box<Printable>
}
Run Code Online (Sandbox Code Playgroud)

如果我不明确地将其放入具有通用特征的盒子中,则会得到:

错误:类型不匹配:预期Box<Printable>但已发现 Box<TypeB>(预期特征可打印但已发现结构TypeB)

所以我想知道:

  • 如果这是在Rust中继续进行以返回特征类型的正常方法
  • 为什么Rust编译器无法推断出自动向下转换

任何的想法?我正在使用编译器的当前夜间版本。

huo*_*uon 2

是的,像这样的特征对象是返回特征的正确方法,尽管如果可能的话,返回不带 a 的具体类型Box更灵活:该函数的调用者可以根据需要进行装箱/强制转换。如果这不能直接实现,定义并返回一个enum可能可行。(拳击和特质对象应该被视为最后的手段:它通常不如其他策略有效。)

不幸的是,隐式强制转换还不能从返回值中推断(它们在其他上下文中会这样做,例如,foo(box bar)如果需要,将将该参数强制为特征对象);这有望得到解决,但目前需要显式转换。