1
uint id = zombies.push(Zombie(_name, _dna)) - 1;

错误理解:

仅记录加入数组的僵尸的下标

正确理解:

1. 创建一个 Zombie 结构体实例

1
Zombie(_name, _dna)

这是对 Zombie 结构体的构造(只是内存中的一个临时对象)。

2. 调用 zombies.push(...) 将它加入数组

1
zombies.push(...)

push 会把这个新的僵尸放入 zombies 动态数组中,并且返回当前数组的新长度。

3. 计算该僵尸的下标(ID)

因为 push 返回的是「数组新长度」,所以减 1 就是索引:

1
uint id = ... - 1;

该代码等价于:

1
2
zombies.push(Zombie(_name, _dna));   // 加入数组
uint id = zombies.length - 1; // 获取下标