Как восстановить конкретный тип из любого - PullRequest
0 голосов
/ 21 февраля 2020

Код:

use std::fmt::Debug;
use std::any::Any;

fn any_to_u16(value: &dyn Any)
{
    let v = value as u16;
}

fn main() 
{
    let x = true;
    any_to_u16(&x);
}

Ошибка:

error[E0606]: casting `&(dyn std::any::Any + 'static)` as `u16` is invalid
 --> src/lib.rs:6:13
  |
6 |     let v = value as u16;
  |             ^^^^^^^^^^^^
  |
  = help: cast through a raw pointer first

Детская площадка Как исправить?

1 Ответ

1 голос
/ 21 февраля 2020

Вы должны использовать Any::downcast_ref:

use std::any::Any;

fn any_to_u16(value: &dyn Any)
{
    if let Some(value) = value.downcast_ref::<bool>().map(|b| *b as u16) {
        // value is a `bool`
        assert_eq!(value, 1);
    }
}

fn main() 
{
    let x = true;
    any_to_u16(&x);
}
...