У меня есть система плагинов, в которой я передаю &dyn Any
динамически загружаемой функции ржавчины, но при понижении значения ссылки не получается, потому что TypeId
различаются (для одного и того же типа), хотя я добавил rustflags = ["-Cmetadata=12345678"]
в конфигурацию груза обоих ящиков. Также кажется, что затронуты только типы из внешних ящиков (я пробовал ()
, и он дал одинаковый TypeId
в обоих ящиках). В настоящее время я использую необработанные указатели (unsafe { &*(v as *const dyn Any as *const Type) }
), чтобы обойти эту проблему, но я бы предпочел решение без небезопасного кода.
Например, следующий код:
println!("CRATE 1: TypeId of `()`: `{:?}`, TypeId of `toml::Value`: `{:?}`",
TypeId::of::<()>(), TypeId::of::<toml::Value>());
производит этот вывод:
CRATE 1: TypeId of `()`: `TypeId { t: 7549865886324542212 }`, TypeId of `toml::Value`: `TypeId { t: 9270396907601429078 }`
CRATE 2: TypeId of `()`: `TypeId { t: 7549865886324542212 }`, TypeId of `toml::Value`: `TypeId { t: 5704635987193303200 }`
РЕДАКТИРОВАТЬ: это не похоже на проблему с разными версиями зависимостей, поскольку ящик 2 (который загружается динамически) зависит от ящика 3 (который также динамически загружается), и проблема все еще возникает, хотя и ящик 2, и ящик 3, являются локальными зависимостями (так что есть только одна версия). Ящик 1, кстати. ящик, в который загружаются ящики 2 и 3.
РЕДАКТИРОВАТЬ: Я удалил параметр -Cmetadata
из всех 3 ящиков, и теперь я получаю тот же TypeId
для toml::Value
, однако TypeId
типа в ящике 1, который я хочу уменьшить в ящике 2, по-прежнему отличается.
toml
0.4.5, а для ящика 2 требуется 0.4.8 или что-то в этом роде? - person trentcl   schedule 17.08.2019-C
параметры повлияют на идентификаторы типов; это для кодогенерации. Идентификаторы типа разрешаются внутри самого rustc, прежде чем он передается в LLVM. - person trentcl   schedule 17.08.2019TypeId
ген. В любом случае, я удалил эту опцию из всех 3 ящиков, и теперь я получаю то жеTypeId
дляtoml::Value
, но не для типа в ящике 3, который я хочу уменьшить в ящике 2. Так что это фактически влияет наTypeId
, но не так, как я думал оно делает. - person TobiP64   schedule 18.08.2019TypeId
типа в ящике загрузчика по-прежнему отличается. - person TobiP64   schedule 18.08.2019