在rust中,我可以将Arc<i32>
转换为Arc<Mutex<i32>>
:
let num = 5;
let arc_num = Arc::new(num);
let mtx_num = Arc::new(Mutex::new(*(arc_num.deref())));
但在特质方面,这种转换就失败了:
use std::sync::{Arc, Mutex};
use std::ops::Deref;
pub trait T {}
#[derive(Copy, Clone)]
pub struct Var {
}
impl T for Var {}
pub fn convert(var: Arc<dyn T>) -> Arc<Mutex<dyn T>> {
return Arc::new(Mutex::new(*(var.deref())));
}
因为*(var.deref())
在编译时不知道大小。
那么,是否有可能将Arc<dyn T>
转换为Arc<Mutex<dyn T>>
呢?
1条答案
按热度按时间ewm0tg9j1#
只有在这种特质的帮助下,
问题是编译器不知道
dyn T
的大小,所以它不能在堆栈上保留足够的空间,也不能将数据复制到那里。即使您以某种方式克服了这个问题,您的
dyn T
也可能不是Copy
,甚至不是Clone
,因为trait T
不需要这样做,如果它这样做了,它就不是对象安全的,因为Clone
不是。您也不需要导入
Deref
,因为您可以像我上面所做的那样将其与它的操作符*
一起使用。