转换为盒子

2024-05-24

我有一个Box<Trait>,并希望能够将其投射到Box<Obj>。有BoxAny http://doc.rust-lang.org/std/boxed/trait.BoxAny.html据说这样做,但试图打电话t.downcast::<Obj>()说没有方法downcast在适用范围。

如果您有参考,文档将显示如何执行此操作。你可以这样做&Trait as &Any。但这似乎不可能做到boxedTrait as Box<Any>.

这是一个操场 http://is.gd/oe5bvt显示我的意思。


Any允许向下转换为具体类型,因此您need当您转换为时了解这个具体类型Box<Any>。但是,如果您只有某个其他特征的特征对象,那么您就不知道具体类型 - 这正是特征对象的要点。所以你不能从Box<SomeTrait> to Box<Any>, 是不可能的。

理想情况下应该可以写类似的东西Box<Show+Any>。这将允许使用Show方法以及Any方法。然而,这也是不可能的:除了主要特征之外,您只能编写生命周期界限和内置类型,因此Box<Show+Sync+'a>是合法的,但是Box<Show+Any> is not.

如果您拥有想要使用的特质Any,那么实现这一点的一种方法是特征继承:

trait MyTrait : Any {
    // ...
}

但是,继承不适用于特征对象,因此您无法调用Any上的方法Box<MyTrait>。有一个解决方法,涉及重新实现Any(可以发现here https://github.com/teepee/teepee/blob/7ef85de23c84642f248922a6b48d16a642669448/src/httpcommon/headers/mod.rs),但它一点也不漂亮。

不幸的是,我不知道做这种事情的简单方法。像这样的事情可能可以用一些不安全的代码来实现,但我不知道如何实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转换为盒子 的相关文章

随机推荐