Dynamic 有没有办法将特征引用转换为另一个未连接类型的对象?

Dynamic 有没有办法将特征引用转换为另一个未连接类型的对象?,dynamic,plugins,rust,Dynamic,Plugins,Rust,我有一个从共享库动态加载的接口集合。我希望能够将这些降级接口转换为它们的原始类型(trait) struct A{} fn abstract_a我想你要找的是: 设y:&TargetTrait=Any::downcast_ref::(x).expect(“预期A”); 您必须指定具体类型AAnytrait对象不包含有关底层类型实现的特征的任何信息,因此不能直接从&Any交叉转换到&TargetTrait;您必须知道基础类型 如果downcast_ref返回None,expect将死机;如果这不

我有一个从共享库动态加载的接口集合。我希望能够将这些降级接口转换为它们的原始类型(trait)

struct A{}

fn abstract_a我想你要找的是:

设y:&TargetTrait=Any::downcast_ref::(x).expect(“预期A”);
您必须指定具体类型
A
Any
trait对象不包含有关底层类型实现的特征的任何信息,因此不能直接从
&Any
交叉转换到
&TargetTrait
;您必须知道基础类型


如果
downcast_ref
返回
None
,expect将死机;如果这不是你想要的,你必须决定当
x
不是
A
时你想要发生什么,并与
downcast\u ref
的结果进行匹配。

你能将集合中的元素类型转换为任意(原始)接口类型(trait)吗?也许a会有帮助。共享库加载对问题至关重要吗?@trentcl我不这么认为。如果我理解的很好,OP想要一个带有C++的FFI使用
x.downcast\u ref().unwrap()
而不是
magic\u conversion(x)
。不知道特质对象是否跨FFI边界工作;但是,当然不是用C++(你需要把每个C++类型都以一个独立的生锈类型来明确地表示为锈)。@ TrutCl Boiethios是正确的,问题不在于有一个集合,正如它在“可能的副本”中所呈现的那样。是的,我打算在FFI期间使用DyrimeSkyCube,但是使用RealSudio共享LIB,而不是C++,所以斯特凡的识别应该没有问题。mentioned@OktavianClemens:实际上,这是一个问题,因为Rust没有定义的ABI。您必须确保使用完全相同的编译器和编译选项编译共享库,并且所有可传递依赖项都完全相同。。。在这一点上,您还可以使用静态链接来实现所有的差异。另外,考虑到您似乎试图转换到一个接口,我认为您想要的是不可能的。锈蚀没有界面,也没有“交叉铸造”(即界面之间)。我想更多的细节可能会有所帮助。
struct A {}
fn abstract_a<'l>() -> &'l Any { return &A{} }

trait TargetTrait { fn some_method(); }
impl TargetTrait for A { fn some_method() { println!("HELLO"); } }    

fn main() {
    let x: &Any = abstract_a();
    let y: &TargetTrait = magic_conversion<&TargetTrait> (x);
}
// question: does 'magic_conversion'(or 'dynamic_cast') exist? what is it?
/* simplified for readability */
// this part is known
let some_lib = loadlib("path/to/lib.so")
let some_interface: &Any = some_lib.loadfunc<&Any>("constructor_func")()
    /* loader does not know what target type constructor has, so it presumes 'Any' */

// the problem:
let dependent_class = Some(class)
dependent_class.graphics = dynamic_cast<IGraphics>(some_interface)
let y: &TargetTrait = Any::downcast_ref::<A>(x).expect("Expected an A");