Я читал "24 дня Rust" и пример AnyMap
использования просто взорвал мой разум. Рассмотрим следующий код:
#[deriving(Show)]
struct Port(u32);
#[deriving(Show)]
struct ConnectionLimit(u32);
В нем говорится:
Здесь типы
Port
иConnectionLimit
являются абстракциями базового целого числа (без накладных расходов во время выполнения!).
Очень хорошо, я могу понять, как это может быть достигнуто. Все типы проверяются во время компиляции, а во время выполнения у нас есть только u32. Но как в таком случае создать карту из какого-то TypeId
в Box<Any>
? И как Any можно привести к любому подтипу, например u32?
исходный код на AnyMap
довольно сложен и требует много метапрограммирования. Как это работает? Может быть, это просто ошибка в «24 днях Rust», а Port
и ConnectionLimit
на самом деле имеют накладные расходы во время выполнения?