Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何从trait对象获取对具体类型的引用?_Rust_Traits - Fatal编程技术网

Rust 如何从trait对象获取对具体类型的引用?

Rust 如何从trait对象获取对具体类型的引用?,rust,traits,Rust,Traits,如何从该代码中的a变量获取Box或&B或&Box: trait A {} struct B; impl A for B {} fn main() { let mut a: Box<dyn A> = Box::new(B); let b = a as Box<B>; } trait A{} 结构B; B{}的impl A fn main(){ 让mut a:Box=Box::new(B); 设b=a为框; } 此代码返回一个错误: error[E06

如何从该代码中的
a
变量获取
Box
&B
&Box

trait A {}

struct B;
impl A for B {}

fn main() {
    let mut a: Box<dyn A> = Box::new(B);
    let b = a as Box<B>;
}
trait A{}
结构B;
B{}的impl A
fn main(){
让mut a:Box=Box::new(B);
设b=a为框;
}
此代码返回一个错误:

error[E0605]:非原语强制转换:`std::boxed::Box`as`std::boxed::Box``
-->src/main.rs:8:13
|
8 |设b=a为方框;
|             ^^^^^^^^^^^
|
=注意:`as`表达式只能用于在基元类型之间转换。考虑使用“从”特性

有两种方法可以在铁锈中进行下铸。首先是使用。请注意,这只允许您向下浇铸到确切的原始混凝土类型。像这样:

use std::any::Any;

trait A {
    fn as_any(&self) -> &dyn Any;
}

struct B;

impl A for B {
    fn as_any(&self) -> &dyn Any {
        self
    }
}

fn main() {
    let a: Box<dyn A> = Box::new(B);
    // The indirection through `as_any` is because using `downcast_ref`
    // on `Box<A>` *directly* only lets us downcast back to `&A` again.
    // The method ensures we get an `Any` vtable that lets us downcast
    // back to the original, concrete type.
    let b: &B = match a.as_any().downcast_ref::<B>() {
        Some(b) => b,
        None => panic!("&a isn't a B!"),
    };
}
然而,这使你无法使用任何其他方法;在这里,你所能做的就是将其向下转换为一种混凝土类型


作为潜在兴趣的最后一点,板条箱允许您将
Any
的功能与您自己的特性结合起来。

应该清楚,如果有另一种类型的
C
实现
a
,并且您尝试将
Box
转换为
Box
,转换可能会失败。我不知道你的情况,但在我看来,这很像是你将其他语言(如Java)的技术带入了铁锈。我从未在Rust中遇到过这种问题——也许可以改进代码设计以避免这种类型的强制转换

如果你愿意,你可以用它来“铸造”几乎任何东西。不幸的是,如果我们只想抛出
框,我们就会遇到问题。但这仍然不稳定。我认为这对OP没有任何用处;不要用它


在这个非常相似的问题中有更好的选择:

谢谢你的回答。我正试图了解如何应对这种情况。很高兴了解可能的解决方案。值得指出的是,为什么需要使用
as__any
函数。这是为
B
实现的,并采用类型为
&B
的参数
self
,该参数被转换为
&Any
,以后可以转换回a
&B
。如果将
a.as_any()
替换为
(&*a as&any)
,则只能转换回转换为
&any
的类型,即
&a
<代码>&A
&B
不是一回事,因为它们有不同的v形表。我已经找了一整天了。有时候生锈的感觉很反直觉。对于下一个谷歌用户来说:使用板条箱可能更容易。
fn main() {
    let a: Box<dyn Any> = Box::new(B);
    let _: &B = match a.downcast_ref::<B>() {
        Some(b) => b,
        None => panic!("&a isn't a B!")
    };    
}
let (b, vptr): (Box<B>, *const ()) = unsafe { std::mem::transmute(a) };