插叙 | 知识是相通的之我与 i 的小故事插叙
October 16th, 2023

转码小故事01 | 知识是相通的之我与 i 的小故事

一言以蔽之: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];
    }
Subscribe to Purple
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from Purple

Skeleton

Skeleton

Skeleton