Solidity进阶之路:僵尸攻击人类 - 第7章: Storage与Memory

Solidity Path: Beginner to Intermediate Smart Contracts

课程链接:https://cryptozombies.io/zh/lesson/2

你成功晋升到第二课啦!

厉害了,我的人类! 你比我设想的更会编程! 第二课中,你会学到如何通过猎食其他生物,扩张你的僵尸军团在这一课里,我们会使用到一些高级的Solidity概念,所以你一定要先完成第一课。

第7章: Storage与Memory

Solidity中,有两个地方可以存储变量 ——storagememory

Storage变量是指永久存储在区块链中的变量。Memory变量则是临时的,当外部函数对某合约调用完成时,内存型变量即被移除。你可以把它想象成存储在你电脑的硬盘或是RAM中数据的关系。

大多数时候你都用不到这些关键字,默认情况下Solidity会自动处理它们。状态变量(在函数之外声明的变量)默认为“存储(Storage)”形式,并永久写入区块链;而在函数内部声明的变量是“内存(memory)”型的,它们函数调用结束后消失。

然而也有一些情况下,你需要手动声明存储类型,主要用于处理函数内的结构体数组时:

contract SandwichFactory {
     

    struct Sandwich {
     
        string name;
        string status;
    }
    
    //结构体数组
    Sandwich[] sandwiches;

    function eatSandwich(uint _index) public {
     
        // Sandwich mySandwich = sandwiches[_index];

        // 上面看上去很直接,不过 Solidity 将会给出警告
        // 告诉你应该明确在这里定义 storage 或者 memory

        // 所以你应该明确定义 storage :
        Sandwich storage mySandwich = sandwiches[_index];
        // ...这样 `mySandwich` 是指向 sandwiches[_index] 的指针
        
        // 在存储里,另外...
        mySandwich.status = "Eaten!";
        // ...这将永久把区块链存储中的sandwiches[_index]变量修改

        // 如果你只想要一个副本,可以使用 memory :
        Sandwich memory anotherSandwich = sandwiches[_index + 1];
        // ...这样 anotherSandwich 就仅仅是一个内存里的副本了
        
        // 另外...
        anotherSandwich.status = "Eaten!";
        // ...将仅仅修改临时变量,对区块链中的 sandwiches[_index + 1] 变量没有任何影响
        
        // 不过你可以这样做:
        sandwiches[_index + 1] = anotherSandwich;
        // ...如果你想把针对副本的改动保存到区块链存储
    }
}

如果你还没有完全理解究竟应该使用哪一个,也不用担心 —— 在本教程中,我们将告诉你何时使用storage或是memory,并且当你不得不使用到这些关键字的时候,Solidity编译器也发警示提醒你的。

现在,只要知道在某些场合下也需要你显式地声明storagememory就够了!

你可能感兴趣的:(Solidity,Path,智能合约,以太坊,区块链)