【问题标题】:Solidity Memory data locationSolidity 内存数据位置
【发布时间】:2022-01-04 16:37:29
【问题描述】:

我一直在学习 Solidity 的新旅程。现在我进入了结构+数据位置课程,当我没有使用与讲师完全相同的示例时,我遇到了一种情况,两者都有效。我想知道哪一个在技术上更正确。

关于讲师的做法,我知道如果该数据变量已经存在并填充了数据,并且我们在存储上使用它,那是可以理解的,但对于内存案例,我仍然不明白它的含义。

这里有两个例子:

我的:

struct PERSON {
        uint256 id;
        string name;

    }

PERSON public personList;

function updateNewPerson(uint256 _index, string memory _name) public {
        PERSON memory newUpdatedPerson;
        newUpdatedPerson.name = _name;
        personList[_index] = newUpdatedPerson;
    }

导师代号:

  struct PERSON {
            uint256 id;
            string name;
    
        }

PERSON public personList;


    function updateNewPerson(uint256 _index, string memory _name) public {
            PERSON memory newUpdatedPerson = personList[index];
            newUpdatedPerson.name = _name;
            personList[_index] = newUpdatedPerson;
        }

这与我要引用的存储数据位置的示例相同:

function updateStoragePerson(uint256 _index, string memory _name) public {
        PERSON storage newUpdatedPerson = personList[_index];
        newUpdatedPerson.name = _name;
}

我试图弄清楚那里有什么不同,我想我已经开始理解它了,如果我错了,请纠正我。

所以在我的示例中,我基本上只是传递新用户插入新值,在本例中为 _name,然后在将其返回给数组时,通过索引数组将其传递到其位置。

在讲师示例中,他正在传递数组索引案例内容,即 id 和 name,然后在将数据传回数组之前从函数中插入新的 name 值,在这种情况下 id 和 _name 是一样的。

【问题讨论】:

    标签: memory blockchain ethereum solidity smartcontracts


    【解决方案1】:

    我可以看到,在您的代码中,当您创建一个 newUpdatedPerson 时,您正在创建一个 PERSON 类型的空变量,然后您只用名称填充它,而您的讲师从一个人那里获取原始值它已经存在,然后更新它的值。这将导致您的 personList 中的 newUpdatedPerson 更新其名称,但其 id 将变为空。

    关于存储数据位置,它所做的是将newUpdatedPerson存储到区块链中,从而产生额外的gas费用。此外,newUpdatedPerson 不会存储到 personList 中,我认为您需要这样做,并且您从 personList[_index] 调用的人不会被更新。

    希望这些信息对您有所帮助:)

    【讨论】:

      【解决方案2】:
      • 状态变量默认存储(值存储在区块链中)。

      • 函数中的局部变量默认是内存的(值临时存储在内存中)。

      • 结构体是默认存储(值存储在区块链中)。

      我解释了内存和存储类型的行为有何不同on this stackoverflow post

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-26
        • 1970-01-01
        • 1970-01-01
        • 2018-11-10
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        相关资源
        最近更新 更多