Для последнего в субстрате Master
Субстрат имеет удалено As
в пользу From
/ Into
. Предполагается, что все типы по крайней мере u32
.
Из признака SimpleArithmatic
реализовано следующее:
From
: u8
, u16
, u32
TryFrom
: u64
, u128
, usize
TryInto
: u8
, u16
, u32
, u64
, u128
, usize
Еще одна особенность также обеспечивает эргономическое безошибочное преобразование, когда вам все равно, если значение насыщается.
UniqueSaturatedInto
: u8
, u16
, u32
, u64
, u128
UniqueSaturatedFrom
: u64
, u128
ПРИМЕЧАНИЕ на SaturatedConversion
от Гав
SaturatedConversion
(saturated_into
и saturated_from
) не должны использоваться, если вы не знаете, что делаетевы продумали и рассмотрели все варианты, а ваш сценарий использования подразумевает, что насыщенность в корне верна.Единственный раз, когда я представляю, что это дело глубоко в арифметике времени выполнения, где вы логически уверены, что оно не будет переполнено, но не можете предоставить доказательства, потому что это будет зависеть от согласованного ранее существующего состояния.
Это означает, что работать с u32
на конкретные типы подложек должно быть легко:
pub fn u32_to_balance(input: u32) -> T::Balance {
input.into()
}
Для больших типов вам необходимо обработать случай, когда тип Balance
для среды выполнения меньше, чем типдоступно:
pub fn u64_to_balance_option(input: u64) -> Option<T::Balance> {
input.try_into().ok()
}
// Note the warning above about saturated conversions
pub fn u64_to_balance_saturated(input: u64) -> T::Balance {
input.saturated_into()
}
При преобразовании из T::Balance
в примитив ржавчины необходимо также выполнить преобразование между несовместимыми типами:
pub fn balance_to_u64(input: T::Balance) -> Option<u64> {
TryInto::<u64>::try_into(input).ok()
}
// Note the warning above about saturated conversions
pub fn balance_to_u64_saturated(input: T::Balance) -> u64 {
input.saturated_into::<u64>()
}
Для субстрата v1.0
Субстрат обеспечивает pub trait As<T>
в sr-primitives
ящике :
/// Simple trait similar to `Into`, except that it can be used to convert numerics between each
/// other.
pub trait As<T> {
/// Convert forward (ala `Into::into`).
fn as_(self) -> T;
/// Convert backward (ala `From::from`).
fn sa(_: T) -> Self;
}
Вот несколько рабочих примеров того, как его можно использовать:
impl<T: Trait> Module<T> {
// `as_` will turn T::Balance into a u64
pub fn balance_to_u64(input: T::Balance) -> u64 {
input.as_()
}
// Being explicit, you can convert a `u64` to a T::Balance
// using the `As` trait, with `T: u64`, and then calling `sa`
pub fn u64_to_balance(input: u64) -> T::Balance {
<T::Balance as As<u64>>::sa(input)
}
// You can also let Rust figure out what `T` is
pub fn u64_to_balance_implied(input: u64) -> T::Balance {
<T::Balance as As<_>>::sa(input)
}
// You can also let Rust figure out where `sa` is implemented
pub fn u64_to_balance_implied_more(input: u64) -> T::Balance {
T::Balance::sa(input)
}
}