3.6 KiB
id | title |
---|---|
maps-records | Maps, Records |
So far we've seen pretty basic data types. LIGO also offers more complex built-in constructs, such as Maps and Records.
Maps
Maps are natively available in Michelson, and LIGO builds on top of them. A requirement for a Map is that its keys be of the same type, and that type must be comparable.
Here's how a custom map type is defined:
type ledger is map(address, tez);
type ledger = (address, tez) map
And here's how a map value is populated:
const ledger: ledger = map
("tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx": address) -> 1000mutez;
("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address) -> 2000mutez;
end
Notice the
->
between the key and its value and;
to separate individual map entries.
("<string value>": address)
means that we type-cast a string into an address.
let ledger: ledger = Map.literal
[ (("tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx": address), 1000mutez) ;
(("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address), 2000mutez) ;
]
Map.literal constructs the map from a list of key-value pair tuples,
(<key>, <value>)
. Note also the;
to separate individual map entries.
("<string value>": address)
means that we type-cast a string into an address.
Accessing map values by key
If we want to access a balance from our ledger above, we can use the []
operator/accessor to read the associated tez
value. However, the value we'll get will be wrapped as an optional; in our case option(tez)
. Here's an example:
const balance: option(tez) = ledger[("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address)];
let balance: tez option = Map.find_opt ("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address) ledger
Obtaining a map value forcefully
Accessing a value in a map yields an option, however you can also get the value directly:
const balance: tez = get_force(("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address), ledger);
let balance: tez = Map.find ("tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN": address) ledger
Records
Records are a construct introduced in LIGO, and are not natively available in Michelson. The LIGO compiler translates records into Michelson Pairs
.
Here's how a custom record type is defined:
type user is record
id: nat;
is_admin: bool;
name: string;
end
type user = {
id: nat;
is_admin: bool;
name: string;
}
And here's how a record value is populated:
const user: user = record
id = 1n;
is_admin = True;
name = "Alice";
end
let user: user = {
id = 1n;
is_admin = true;
name = "Alice";
}
Accessing record keys by name
If we want to obtain a value from a record for a given key, we can do the following:
const is_admin: bool = user.is_admin;
let is_admin: bool = user.is_admin