Примечание редактора: этот вопрос относится к версии Rust до 1.0 и содержит ссылки на некоторые элементы, которых нет в Rust 1.0. Ответы по-прежнему содержат ценную информацию.
Какой идиоматический способ конвертировать из (скажем) usize
в u32
?
Например, приведение с использованием 4294967295us as u32
работает и справочные документы Rust 0.12 по приведению типов говорят
Числовое значение может быть приведено к любому числовому типу. Необработанное значение указателя может быть приведено к или из любого целочисленного типа или необработанного указателя. Любое другое приведение не поддерживается и не будет компилироваться.
но 4294967296us as u32
будет тихо переполнен и даст результат 0.
Я нашел ToPrimitive
и FromPrimitive
которые предоставляют хорошие функции, такие как to_u32() → Option<u32>
, но они помечены как нестабильные:
#[unstable(feature = "core", reason = "trait is likely to be removed")]
Какой идиоматический (и безопасный) способ преобразования между числовыми (и указательными) типами?
Размер isize
/usize
зависящий от isize
является одной из причин, по которой я usize
этот вопрос - исходный сценарий состоял в том, что я хотел преобразовать из u32
в usize
чтобы я мог представить дерево в Vec<u32>
(например, let t = Vec![0u32, 0u32, 1u32]
, тогда получить прародителя узла 2 было бы t[t[2us] as usize]
), и я удивлялся, как это не usize
если usize
будет меньше 32 бит.