Solidity Memory数据位置



我一直在跟随我的新旅程学习Solidity。现在我参加了structs+Data locations课程,遇到了一种情况,即我没有使用与讲师完全相同的示例,两者都有效。我想知道哪一个在技术上更正确。

关于讲师的做法,我理解,如果数据变量已经存在,充满了数据,并且我们正在存储器上使用它,这是可以理解的,但对于内存的情况,我仍然不明白它的含义。

以下是两个示例:

矿山:

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,然后在将数据传递回数组之前从函数中插入新的名称值,在这种情况下,id和_name是相同的。

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

newUpdatedPerson将存储在personList中,因为从存储到本地存储的副本实际上复制了对存储的引用,因此对newUpdatedPerson的任何更新都将导致对personList的更新。

从存储到本地存储变量的分配也只分配引用。

我希望您能发现这些信息有帮助:(

  • 默认情况下,状态变量是存储的(值存储在区块链中(。

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

  • 默认情况下,结构是存储的(值存储在区块链中(。

我解释了内存和存储类型在后的堆叠流中的表现如何不同

最新更新