一言以蔽之:i 在 Solidity(甚至应该在其他的语言里)不仅只是一个简单的字母可以用来构成代数关系,还是 I(ndex)的缩写,所以只是纯粹想构建新的代数关系的时候,尽量用别的字母,比如 a,b,c……而不是 i。
自从我开始学 Solidity,我发现 i 是一个经常会出现的字母,不过直到写这篇文的前两分钟,我一直都以为我之前学习过程中遇到的所有的 i 都只是一个代数,仅此而已,但事实上,你遇到的 i 也许还是 i(ndex) 的缩写。
之所以对 i 记忆深刻,是因为我一开始学 Solidity 用的是 WTF 的资料,在 WTF Solidity101 的第十章——《控制流》那里,出现了一个插入排序算法,当时让初学 Solidity 的我陷入了深深的迷惘,因为那个作者提到“插入排序(InsertionSort
)是最简单的一种排序算法,也是很多人学习的第一个算法”。我记得我当晚在理解那个代码上花费了要三个小时,一度怀疑自己是不是太过蠢笨,以下就是这串代码:
// 插入排序 正确版
function insertionSort(uint[] memory a) public pure returns(uint[] memory) {
// note that uint can not take negative value
for (uint i = 1;i < a.length;i++){
uint temp = a[i];
uint j=i;
while( (j >= 1) && (temp < a[j-1])){
a[j] = a[j-1];
j--;
}
a[j] = temp;
}
return(a);
}
昨晚我听了一节 Halo2 的 D 老师小灶课,当时讲到对约束系统的理解,这个地方相对比较难理解,所以给我讲解的时候,用了一个可视化的例子。当时例子里出现了 i &i+1,从我的角度来说,一开始我下意识认为 i 就是一个普通字母,来构成代数关系,此外没有其它的含义;而从 D 老师的角度来说,他默认这个 i 的含义不需要向我解释。但是到后面我始终难以理解,于是我问出了那个问题:为什么这个例子里要使用 i ?能否是别的字母?难不成这个 i 其实是 index 的缩写?(因为例子用到了矩阵、类似坐标的这种形式,所以我做出了这个猜测)
没想到,真的是 Index 的缩写,i 在那里就表示 index!令人莞尔的是,当 D 老师听到我的这个问题,大吃一惊!我俩面面相觑,原来我竟不理解 i 的意思,他竟默认觉得我理解 i 的意思。
重点来了,因为这个昨晚的这个事让我记忆深刻,所以今天当我在看 Azuki 的代码的时候遇到了类似的代码,我突然明白了之前那串折磨了我很久的插序算法。以下是 Azuki 让我产生共鸣感的几行代码:
require(
addresses.length == numSlots.length,
"addresses does not match numSlots length"
);
for (uint256 i = 0; i < addresses.length; i++) {
allowlist[addresses[i]] = numSlots[i];
}