Traits作为函数的返回值和显式转换

时间:2014-07-06 08:26:35

标签: casting rust traits

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

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

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

  

错误:类型不匹配:预期Box<Printable>但找到了   Box<TypeB>(预期特性可打印,但发现结构类型B)

所以我想知道:

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

有什么想法吗?我正在使用当前的夜间版本的编译器。

1 个答案:

答案 0 :(得分:2)

是的,像这样的特征对象是返回特征的正确方法,但是,如果可能的话,返回一个没有Box的具体类型会更灵活:如果他们可以使用该函数的调用者需要。如果这不是直接可能的,那么定义和返回enum可能会有效。 (拳击和特质对象应该被认为是最后的手段:它的效率往往低于其他策略。)

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