import "@stdlib/deploy"; // for Deployable trait
m: map<Int as uint16, Int>; // 数组的 Int 值作为 Ints 到 Ints 的映射,
length:Int = 0; // 数组的长度,默认为 0
const MaxArraySize:Int = 5_000; // 5,000 entries max, to stay reasonable far from limits
// Extension mutation function for adding new entries to the end of the array
extends mutates fun append(self: Array, item: Int) {
require(self.length + 1 <= MaxArraySize, "数组中没有空间留给新条目了!");
self.map.set(self.length, item); // 设置条目(键值对)
self.length += 1; // 增加长度字段
extends mutates fun insert(self: Array, item: Int, idx: Int) {
require(self.length + 1 <= MaxArraySize, "数组中没有空间留给新条目!");
require(idx >= 0, "Index of the item cannot be negative!");
require(idx < self.length, "Index is out of array bounds!");
// Move all items from idx to the right
let i. Int = self.length; // not not:Int = self.length; // 不是错别字,因为我们需要从不曾存在的地方开始
// 注意,我们使用了 !! 操作符,因为我们知道值肯定会在那里
self.map.set(i, self.map.get(i - 1)!!);
self.map.set(idx, item); // 设置条目(键值对)
self.length += 1; // 增加长度字段
// Extension function for getting the value at the given index
extends fun getIdx(self: Array, idx: Int):Int {
require(self.length > 0, "No items in the array!");
require(idx >= 0, "Index of the item cannot be negative!");
require(idx < self.length, "Index is out of array bounds!");
// 注意,我们使用 !! 操作符,因为我们知道值肯定会在那里
return self.map.get(idx)!!;
extends fun getLast(self: Array):Int {
require(self.length > 0, "No items in the array!");
// 注意,我们使用 !! 运算符是因为我们确定值会在那里
return self.map.get(self.length - 1)!!;
// 扩展突变函数,用于删除给定索引中的条目并返回其值
extends mutates fun deleteIdx(self: Array, idx: Int):Int {
require(self.length > 0, "No items in the array to delete!");
require(idx >= 0, "Index of the item cannot be negative!");
require(idx < self.length, "Index is out of array bounds!");
// Remember the value, which is going to be deleted
let memorized:Int = self.map.get(idx)!!;
// 将所有从 idx 开始(包括 idx)的项目移到左边
while (i + 1 < self.length) {
// 注意,我们使用了!!操作符,因为我们知道该值肯定会存在
self.map.set(i, self.map.get(i + 1)!!);
self.map.set(self.length - 1, null); // 删除最后一个条目
self.length -= 1; // 减少长度字段
// 用于删除最后一个条目并返回其值的扩展突变函数
extends fun deleteLast(self: Array):Int {
require(self.length > 0, "No items in the array!");
// 注意,我们使用了!!操作符,因为我们知道值肯定会存在
let lastItem: Int = self.map.get(self.length - 1)!!;
self.map.set(self.length - 1, null); // 删除条目
self.length -= 1; // 减少长度字段
extends mutates fun deleteAll(self: Array) {
return Array{m: emptyMap(), length: 0}; // length 默认为 0
contract MapAsArray with Deployable {
self.array = emptyArray();
// 内部消息接收器,响应字符串消息 "append"
// 内部消息接收器,响应字符串消息 "delete_5h"
// 删除第 5 个项目(如果存在),并回复其值,否则引发错误
self.reply(self.array.deleteIdx(4).toCoinsString().asComment()); // 索引偏移 0 + 4 给出第 5 个项目
// 内部消息接收器,对字符串消息 "del_last "做出响应
self.reply(self.array.deleteLast().toCoinsString().asComment());
// 内部消息接收器,用于响应字符串消息 "get_last"
// 如果数组中存在最新项目,则回复该项目,否则引发错误
self.reply(self.array.getLast().toCoinsString().asComment());
// 内部消息接收器,用于响应字符串消息 "delete_all"