Solidity 内存数据位置
Solidity Memory data location
我一直在追随我学习 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 相同。
我看到的是,在您的代码中,当您创建一个 newUpdatedPerson 时,您正在创建一个 PERSON 类型的空变量,然后您只用名称填充它,而您的指导员从一个已经存在然后更新其价值的人。这将导致您的 personList 中的 newUpdatedPerson 更新其名称,但其 ID 将变为空。
关于存储数据位置,它所做的是将newUpdatedPerson存储到区块链中,从而产生额外的gas费用。此外,newUpdatedPerson 不会存储到 personList 中,我认为您需要这样做,并且您从 personList[_index] 调用的人不会被更新。
希望此信息对您有所帮助:)
状态变量默认存储(值存储在区块链中)。
函数中的局部变量默认在内存中(值临时存储在内存中)。
结构默认存储(值存储在区块链中)。
我解释了内存和存储类型的不同之处
我一直在追随我学习 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 相同。
我看到的是,在您的代码中,当您创建一个 newUpdatedPerson 时,您正在创建一个 PERSON 类型的空变量,然后您只用名称填充它,而您的指导员从一个已经存在然后更新其价值的人。这将导致您的 personList 中的 newUpdatedPerson 更新其名称,但其 ID 将变为空。
关于存储数据位置,它所做的是将newUpdatedPerson存储到区块链中,从而产生额外的gas费用。此外,newUpdatedPerson 不会存储到 personList 中,我认为您需要这样做,并且您从 personList[_index] 调用的人不会被更新。
希望此信息对您有所帮助:)
状态变量默认存储(值存储在区块链中)。
函数中的局部变量默认在内存中(值临时存储在内存中)。
结构默认存储(值存储在区块链中)。
我解释了内存和存储类型的不同之处