1

我正在编写一个智能合约并希望使用数组来操作数据,但是查看 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

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

4

2 回答 2

1

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

let testData = new Array<string>();

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

于 2019-09-17T04:12:42.443 回答
1

更新

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
于 2019-09-17T12:55:45.070 回答