Как вы конвертируете между специфическими типами субстратов и примитивными типами Rust? - PullRequest
3 голосов
/ 10 мая 2019

Используя структуру блокчейна Substrate, как я могу конвертировать между определенными типами Substrate и примитивными типами Rust и наоборот?

Например:

  • Преобразовать время (T::Moment) в u64
  • Преобразование U64 в T::Balance

и т.д ...

1 Ответ

4 голосов
/ 10 мая 2019

Для последнего в субстрате 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...