Почему метод downcast_ref не найден для типа dyn Any? - PullRequest
4 голосов
/ 22 апреля 2019

Я пытаюсь создать свой собственный фальшивый фреймворк и столкнулся с этой проблемой. Когда я пытаюсь уменьшить тип Any, он не находит метод downcast_ref:

use std::any::Any;
use std::collections::HashMap;

struct X;
struct Y;

fn main() {
    let mut map: HashMap<&'static str, Box<Any + Sync>> = HashMap::new();
    map.insert("x", Box::new(X));
    map.insert("y", Box::new(Y));

    get_x(map);
}

fn get_x(map: HashMap<&'static str, Box<Any + Sync>>) {
    let ref any = map["x"];
    let res = Any::downcast_ref::<X>(any); // Works
    let res = any.downcast_ref::<X>();     // Fails
}

Игровая площадка

error[E0599]: no method named `downcast_ref` found for type `&std::boxed::Box<(dyn std::any::Any + std::marker::Sync + 'static)>` in the current scope
  --> src/main.rs:18:19
   |
18 |     let res = any.downcast_ref::<X>();
   |                   ^^^^^^^^^^^^

Если я вызываю его, используя синтаксис связанной функции, он находит эту функцию и работает без проблем.

Почему компилятор не может найти метод downcast_ref() из переменной any типа dyn Any?

1 Ответ

1 голос
/ 22 апреля 2019

Это потому, что Any::downcast_ref() не реализовано для dyn Any + 'static + Sync, только для:

  • dyn Any + 'static
  • dyn Any + 'static + Send
  • dyn Any + 'static + Send + Sync
...