cast – Traits作为函数的返回值和显式强制转换

完全以与此
question相同的方式,我希望函数的返回类型是特征,返回值是实现该特征的类型的实例.一个简单的例子:

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

如果我没有明确地投入到我的通用特征框中,我得到:

error: mismatched types: expected Box<Printable> but found
Box<TypeB> (expected trait Printable but found struct TypeB)

所以我想知道:

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

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

最佳答案 是的,像这样的特征对象是返回特征的正确方法,但是,如果可能的话,返回没有Box的具体类型会更灵活:如果需要,该函数的调用者可以进行box / cast.如果这不是直接可能的,定义和返回枚举可能会起作用. (拳击和特质对象应该被认为是最后的手段:它通常不如其他策略有效.)

不幸的是,隐式强制还没有从返回值中推断出来(它们在其他情况下也是如此)例如foo(方框栏)会在必要时将该参数强制转换为特征对象);这有望得到修复,但现在需要明确的演员表.

点赞