结构体作为映射键
为了使用结构体作为映射键,您可以在结构体定义上使用 #[derive(Hash)]
。这将为结构体自动生成一个哈希函数,可以在 LegacyMap
中将该结构体作为键来使用。
考虑以下示例,我们希望使用类型为 Pet
的对象作为 LegacyMap
中的键。Pet
结构体有三个字段:name
、age
和 owner
。假设这三个字段的组合能唯一地标识一只宠物。
#[derive(Copy, Drop, Serde, Hash)]
struct Pet {
name: felt252,
age: u8,
owner: felt252,
}
#[starknet::interface]
trait IPetRegistry<TContractState> {
fn register_pet(ref self: TContractState, key: Pet, timestamp: u64);
fn get_registration_date(self: @TContractState, key: Pet) -> u64;
}
#[starknet::contract]
mod PetRegistry {
use hash::{HashStateTrait, Hash};
use super::Pet;
#[storage]
struct Storage {
registration_time: LegacyMap::<Pet, u64>,
}
#[abi(embed_v0)]
impl PetRegistry of super::IPetRegistry<ContractState> {
fn register_pet(ref self: ContractState, key: Pet, timestamp: u64) {
self.registration_time.write(key, timestamp);
}
fn get_registration_date(self: @ContractState, key: Pet) -> u64 {
self.registration_time.read(key)
}
}
}
在 Remix 上测试这个合约.