casting - 特征作为函数的返回值,并显式转换

标签 casting rust 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 编译器无法推断出自动向下转型

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

最佳答案

是的,像这样的 trait 对象是返回 trait 的正确方法,尽管如果可能的话,返回一个没有 Box 的具体类型会更灵活:该函数的调用者可以 box/如果他们需要的话。如果那不是直接可能的,那么定义并返回一个 enum 可能会起作用。 (装箱和特征对象应该被视为最后的手段:它通常不如其他策略有效。)

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

关于casting - 特征作为函数的返回值,并显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24594024/

相关文章:

Java:如何将克隆对象转换为其原始子类?

java - 如何在 Java 中的 equals 覆盖方法中强制转换对象?

rust - 为什么可变引用没有移到这里?

rust - 为什么不能在同一结构中存储值和对该值的引用?

unit-testing - 如何为 grails 2.4 中的特征编写 spock 单元测试用例?

c++ - 试图为所有子类 B 编辑父类的静态变量

c++ - 向下转换指向成员函数的指针

rust - 这两种为 Rust channel 克隆发送者的方式有什么区别?

rust - 在向量中调用结构的特征方法时出现问题

c++ - 基于基类方法的生成类中的运算符重载