Могу ли я безопасно разыграть Box в коробку ? - PullRequest
0 голосов
/ 28 января 2020

Send - это признак маркера, который не влияет на структуру памяти. Тем не менее, механика типа Any остается для меня немного загадочной.

Является ли следующий код звучащим и выполняет ли он то, что я хочу: тип приведения всегда будет корректно понижен до исходного типа бетона:

let what_i_have: Box<dyn Any + Send> = Box::new(69);
let ptr = Box::into_raw(what_i_have);
let what_i_want: Box<dyn Any> = unsafe { Box::from_raw(ptr as *mut dyn Any) };

Я поиграл с этим, и он, кажется, работает нормально. Это так?

В качестве дополнительного вопроса, могу ли я сделать это без блока unsafe?

1 Ответ

3 голосов
/ 28 января 2020

Да, вы можете сделать это безопасно, присвоив значение:

use std::any::Any;

fn main() {
    let what_i_have: Box<dyn Any + Send> = Box::new(69);
    let what_i_want: Box<dyn Any> = what_i_have;
}

См. Также:

...