在 AssemblyScript 中实例化数组的三种不同方法

Posted

技术标签:

【中文标题】在 AssemblyScript 中实例化数组的三种不同方法【英文标题】:Three different ways to instantiate Arrays in AssemblyScript 【发布时间】:2020-01-17 20:31:18 【问题描述】:

我正在编写智能合约并想使用数组来操作数据,但是查看 AssemblyScript 文档,我不确定最好的方法。

对我来说似乎很好用:

let testData:string[] = []

但是当我查阅汇编脚本文档时,推荐了三种创建数组的方法:

// The Array constructor implicitly sets `.length = 10`, leading to an array of
// ten times `null` not matching the value type `string`. So, this will error:
var arr = new Array<string>(10);
// arr.length == 10 -> ERROR

// To account for this, the .create method has been introduced that initializes
// the backing capacity normally but leaves `.length = 0`. So, this will work:
var arr = Array.create<string>(10);
// arr.length == 0 -> OK

// When pushing to the latter array or subsequently inserting elements into it,
// .length will automatically grow just like one would expect, with the backing
// buffer already properly sized (no resize will occur). So, this is fine:
for (let i = 0; i < 10; ++i) arr[i] = "notnull";
// arr.length == 10 -> OK

我什么时候想使用一种类型的实例化而不是另一种类型的实例化?为什么我不总是使用我一开始介绍的版本?

【问题讨论】:

【参考方案1】:

数组字面量方法没有错。基本上相当于

let testData = new Array<string>();

但是,有时您知道数组的长度应该是多少,在这种情况下,使用 Array.create 预分配内存更有效。

【讨论】:

【参考方案2】:

更新

此PR Array.create 已弃用,不应再使用。

老答案

let testData:string[] = []

语义相同

let testData = new Array<string>()

AssemblyScript 不支持为未明确声明为可为空的引用元素预分配稀疏数组(带孔的数组),例如:

let data = new Array<string>(10);
data[9] = 1; // will be compile error

你可以使用:

let data = new Array<string | null>(10);
assert(data.length == 10); // ok
assert(data[0] === null); // ok

Array.create,但在这种情况下,您的长度将为零。 Array.create 实际上只是为后备缓冲区保留容量。

let data = Array.create<string>(10);
assert(data.length == 0); // true

对于普通(非引用)类型,您可以使用通常的方式,而不用关心 nullabe 或通过 Array.create 创建数组:

let data = new Array<i32>(10);
assert(data.length == 10); // ok
assert(data[0] == 0); // ok

【讨论】:

感谢您的详尽回答! > Array.create 实际上只是为后备缓冲区保留容量。这现在更有意义了。使用字符串显式设置可以为空的内容与它似乎成为 i32 类型零数组的情况有什么区别?

以上是关于在 AssemblyScript 中实例化数组的三种不同方法的主要内容,如果未能解决你的问题,请参考以下文章

AssemblyScript:动态本地数组大小

AssemblyScript 是不是支持函数数组?

分配 65536 个元素的数组后,AssemblyScript / WebAssembly 分配失败

Spring实例化bean的三种方式

使用 AssemblyScript 通过引用操作画布数据(类型化数组)

spring学习(02)之bean实例化的三种方式