pub struct Lazy<V, KeyType: StorageKey = AutoKey> { /* private fields */ }Expand description
A simple wrapper around a type to store it in a separate storage cell under its own
storage key. If you want to update the value, first you need to
get it, update the value, and then call
set with the new value.
§Important
The wrapper requires its own pre-defined storage key in order to determine where it
stores value. By default, the is automatically calculated using
AutoKey during compilation. However, anyone can specify a
storage key using ManualKey. Specifying the storage key
can be helpful for upgradeable contracts or you want to be resistant to future changes
of storage key calculation strategy.
§Note
If the contract has two or more Lazy with the same storage key, modifying the value
of one of them will modify others.
This is an example of how you can do this:
use ink::storage::{
    Lazy,
    traits::ManualKey,
};
#[ink(storage)]
#[derive(Default)]
pub struct MyContract {
    owner: Lazy<Address>,
    // todo maybe use something else than `Balance`?
    balance: Lazy<Balance, ManualKey<123>>,
}
impl MyContract {
    #[ink(constructor)]
    pub fn new() -> Self {
        let mut instance = Self::default();
        let caller = Self::env().caller();
        instance.owner.set(&caller);
        instance.balance.set(&123456);
        instance
    }
}Implementations§
Source§impl<V, KeyType> Lazy<V, KeyType>where
    KeyType: StorageKey,
 
impl<V, KeyType> Lazy<V, KeyType>where
    KeyType: StorageKey,
Source§impl<V, KeyType> Lazy<V, KeyType>where
    V: Storable,
    KeyType: StorageKey,
 
impl<V, KeyType> Lazy<V, KeyType>where
    V: Storable,
    KeyType: StorageKey,
Sourcepub fn get(&self) -> Option<V>
 
pub fn get(&self) -> Option<V>
Reads the value from the contract storage, if it exists.
§Panics
Traps if the encoded value doesn’t fit into the static buffer.
Sourcepub fn try_get(&self) -> Option<Result<V>>
 
pub fn try_get(&self) -> Option<Result<V>>
Try to read the value from the contract storage.
To successfully retrieve the value, the encoded key and value
must both fit into the static buffer together.
Returns:
- Some(Ok(_))if- valuewas received from storage and could be decoded.
- Some(Err(_))if retrieving the- valuewould exceed the static buffer size.
- Noneif there was no value under this storage key.
Source§impl<V, KeyType> Lazy<V, KeyType>
 
impl<V, KeyType> Lazy<V, KeyType>
Sourcepub fn get_or_default(&self) -> V
 
pub fn get_or_default(&self) -> V
Reads the value from the contract storage.
Returns the default value for the storage type if no value exists.
Trait Implementations§
Source§impl<V, KeyType> Debug for Lazy<V, KeyType>where
    KeyType: StorageKey,
 
impl<V, KeyType> Debug for Lazy<V, KeyType>where
    KeyType: StorageKey,
Source§impl<V, KeyType> Default for Lazy<V, KeyType>where
    KeyType: StorageKey,
We implement this manually because the derived implementation adds trait bounds.
 
impl<V, KeyType> Default for Lazy<V, KeyType>where
    KeyType: StorageKey,
We implement this manually because the derived implementation adds trait bounds.
Source§impl<V, KeyType> Storable for Lazy<V, KeyType>where
    KeyType: StorageKey,
 
impl<V, KeyType> Storable for Lazy<V, KeyType>where
    KeyType: StorageKey,
Source§fn encode<T: Output + ?Sized>(&self, _dest: &mut T)
 
fn encode<T: Output + ?Sized>(&self, _dest: &mut T)
Source§fn decode<I: Input>(_input: &mut I) -> Result<Self, Error>
 
fn decode<I: Input>(_input: &mut I) -> Result<Self, Error>
Source§fn encoded_size(&self) -> usize
 
fn encoded_size(&self) -> usize
Source§impl<V, Key, InnerKey> StorableHint<Key> for Lazy<V, InnerKey>
 
impl<V, Key, InnerKey> StorableHint<Key> for Lazy<V, InnerKey>
Source§type PreferredKey = InnerKey
 
type PreferredKey = InnerKey
Source§impl<V, KeyType> StorageKey for Lazy<V, KeyType>where
    KeyType: StorageKey,
 
impl<V, KeyType> StorageKey for Lazy<V, KeyType>where
    KeyType: StorageKey,
Source§impl<V, KeyType> StorageLayout for Lazy<V, KeyType>where
    V: StorageLayout + TypeInfo + 'static,
    KeyType: StorageKey + TypeInfo + 'static,
 
impl<V, KeyType> StorageLayout for Lazy<V, KeyType>where
    V: StorageLayout + TypeInfo + 'static,
    KeyType: StorageKey + TypeInfo + 'static,
Source§impl<V, KeyType> TypeInfo for Lazy<V, KeyType>where
    PhantomData<fn() -> (V, KeyType)>: TypeInfo + 'static,
    V: TypeInfo + 'static,
    KeyType: StorageKey + TypeInfo + 'static,
 
impl<V, KeyType> TypeInfo for Lazy<V, KeyType>where
    PhantomData<fn() -> (V, KeyType)>: TypeInfo + 'static,
    V: TypeInfo + 'static,
    KeyType: StorageKey + TypeInfo + 'static,
Auto Trait Implementations§
impl<V, KeyType> Freeze for Lazy<V, KeyType>
impl<V, KeyType> RefUnwindSafe for Lazy<V, KeyType>
impl<V, KeyType> Send for Lazy<V, KeyType>
impl<V, KeyType> Sync for Lazy<V, KeyType>
impl<V, KeyType> Unpin for Lazy<V, KeyType>
impl<V, KeyType> UnwindSafe for Lazy<V, KeyType>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
 
impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
 
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
 
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
 
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
 
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
 
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T, Outer> IsWrappedBy<Outer> for T
 
impl<T, Outer> IsWrappedBy<Outer> for T
§impl<T> SaturatedConversion for T
 
impl<T> SaturatedConversion for T
§fn saturated_from<T>(t: T) -> Selfwhere
    Self: UniqueSaturatedFrom<T>,
 
fn saturated_from<T>(t: T) -> Selfwhere
    Self: UniqueSaturatedFrom<T>,
§fn saturated_into<T>(self) -> Twhere
    Self: UniqueSaturatedInto<T>,
 
fn saturated_into<T>(self) -> Twhere
    Self: UniqueSaturatedInto<T>,
T. Read more§impl<S, T> UncheckedInto<T> for Swhere
    T: UncheckedFrom<S>,
 
impl<S, T> UncheckedInto<T> for Swhere
    T: UncheckedFrom<S>,
§fn unchecked_into(self) -> T
 
fn unchecked_into(self) -> T
unchecked_from.§impl<T, S> UniqueSaturatedInto<T> for S
 
impl<T, S> UniqueSaturatedInto<T> for S
§fn unique_saturated_into(self) -> T
 
fn unique_saturated_into(self) -> T
T.