对于那些阅读本文且拥有类似代码的人,"memory" 可能并不是你需要使用的正确术语。你可能需要使用 "calldata" 或者 "storage" 这些词来代替。以下是解释:
Memory, calldata(和 storage) 是 Solidity 变量存储值的方式。
例如:
1. Memory:以下是使用 "memory" 一词的示例:
pragma solidity ^0.8.9;
import 'hardhat/console.sol';
contract MemoryExample {
uint[] public values;
function doSomething() public
{
values.push(5);
values.push(10);
console.log(values[0]);
modifyArray(values);
}
function modifyArray(uint[] memory arrayToModify) pure private {
arrayToModify[0] = 8888;
console.log(arrayToModify[0])
console.log(values[0])
}
}
注意在私有函数中,'arrayToModify' 是数组的一个拷贝,并没有引用(或指向)传递给私有函数的数组,因此 'values' 数组并未被更改。
2. Calldata 不同,可以用于将变量作为只读变量传递:
pragma solidity ^0.8.9;
contract CallDataExample {
uint[] public values;
function doSomething() public
{
values.push(5);
values.push(10);
modifyArray(values);
}
function modifyArray(uint[] calldata arrayToModify) pure private {
arrayToModify[0] = 8888;
}
}
3. 存储:这里的第三个选项是使用“storage”关键字:
pragma solidity ^0.8.9;
import 'hardhat/console.sol';
contract MemoryExample {
uint[] public values;
function doSomething() public
{
values.push(5);
values.push(10);
console.log(values[0]);
modifyArray(values);
}
function modifyArray(uint[] storage arrayToModify) private {
arrayToModify[0] = 8888;
console.log(arrayToModify[0])
console.log(values[0])
}
}
注意使用memory关键字,arrayToModify变量引用了传入的数组并对其进行修改。