Struct ink_storage::Lazy
source · 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::{
traits::ManualKey,
Lazy,
};
#[ink(storage)]
#[derive(Default)]
pub struct MyContract {
owner: Lazy<AccountId>,
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(_))
ifvalue
was received from storage and could be decoded.Some(Err(_))
if retrieving thevalue
would exceed the static buffer size.None
if 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,
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>
§type Type = Lazy<<V as StorableHint<Key>>::Type, Key>
type Type = Lazy<<V as StorableHint<Key>>::Type, Key>
§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>
impl<V, KeyType> StorageLayout for Lazy<V, KeyType>
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> 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
source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.source§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.