gpt4 book ai didi

rust - 强制 Arc>>>> 到 Arc>>>> 将不起作用

转载 作者:行者123 更新时间:2023-12-04 07:25:14 26 4
gpt4 key购买 nike

我正在尝试将 dyn 特征存储在 Arc<Mutex<Option<Box<>>>>> 中,但是由于某种原因它不起作用

use std::sync::{Arc, Mutex};

trait A{}

struct B{}

impl A for B{}

struct H{
c: Arc<Mutex<Option<Box<dyn A>>>>
}

fn main() {
let c =
Arc::new(Mutex::new(Some(Box::new(B{}))));
H{
c: c
};
}
错误:
error[E0308]: mismatched types
--> src/main.rs:17:12
|
17 | c: c
| ^ expected trait object `dyn A`, found struct `B`
|
= note: expected struct `Arc<Mutex<Option<Box<(dyn A + 'static)>>>>`
found struct `Arc<Mutex<Option<Box<B>>>>`
Playground
看起来它不能存储 dyn作为 Box<B> ,这很奇怪,因为它有效:
fn main() {
let c: Arc<Mutex<Option<Box<dyn A>>>> =
Arc::new(Mutex::new(Some(Box::new(B{}))));
}
有什么不同?

最佳答案

What's the difference?

Box 有一个非常特殊的情况和其他可以包含动态大小值的标准库类型,如 dyn A .
let c = Arc::new(Mutex::new(Some(Box::new(B{}))));
H { c: c };
在这段代码中,您已经初始化了变量 c — 没有类型声明 — 类型被推断为 Arc<Mutex<Option<Box<B>>> 的值,然后尝试将其存储在类型为 Arc<Mutex<Option<Box<dyn A>>> 的字段中.这是行不通的,因为这两种类型具有不同的内存布局。
let c: Arc<Mutex<Option<Box<dyn A>>>> = 
Arc::new(Mutex::new(Some(Box::new(B{}))));
在此代码中,您给出了 c类型声明,因此需要 dyn在构造时已知,这允许强制很快发生,您可以强制 Box<B>Box<dyn A> , 因为 Box实现特殊特性 CoerceUnsized . (相同的机制适用于将 &B 转换为 &dyn A 。)但是,这不适用于包含 Box<B> 的任意类型。 — 甚至没有 Option<Box<B>> ,更不用说你更复杂的类型了。
你可以给 c构建它时的类型:
let c: Arc<Mutex<Option<Box<dyn A>>>> = Arc::new(Mutex::new(Some(Box::new(B{}))));
H { c: c };
或者,稍短但更奇怪,您可以只注释 Box 的直接容器。使用它需要的类型:
let c = Arc::new(Mutex::new(Some::<Box<dyn A>>(Box::new(B{}))));
H { c: c };
或者您可以使用 as 编写显式强制转换运算符(operator):
let c = Arc::new(Mutex::new(Some(Box::new(B{}) as Box<dyn A>)));
H { c: c };

关于rust - 强制 Arc<Mutex<Option<Box<MyStruct>>>>> 到 Arc<Mutex<Option<Box<dyn Trait>>>>> 将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68240685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com