function addOwners(address[] calldata _newOwners) public {
回首一下 solidity 中数据位置,即说明数据存储在那边,solidity 有 3 个位置:
}
for (uint j = i + 1; i < _newOwners.length; j++)
[1] 翻译的Solidity文档-引用范例: https://learnblockchain.cn/docs/solidity/types.html#reference-types
// SPDX-License-Identifier: GPL-3.0
References
pragma solidity >=0.6.9;
请留意,由于EVM不答允修改 calldata,因此无法在 calldata 变量中建设新值或将某些内容复制到 calldata变量。
从 Solidity 0.6.9 版本开始,之前仅用于外部函数(external 修饰的函数[2])的calldata位置,此刻可以在内部函数( internal修饰的函数[3] )利用了。
/// 内部函数可以遍历 calldata 的数组,而不消再复制到内存了。
1.memory :(内存) 即数据在内存中,因此数据仅在其生命周期内(函数挪用期间)有效。2.storage :(链上存储空间),就是状态变量生存的位置,只要合约存在就一直存储.3.calldata :(挪用数据),,一个非凡只读数据位置,用来生存函数挪用参数(之前仅针对外部函数)。
利用 calldata 变量的长处是,它不消将 calldata 数据的副本生存到内存中,并确保不会修改数组或布局(calldata 位置是只读的),因此,假如可以的话,请只管利用 calldata 作为数据位置
}
for (uint i = 0; i < _newOwners.length; i++)
// We pass _newOwners on as a calldata array.
[3] internal修饰的函数: https://learnblockchain.cn/docs/solidity/contracts.html#getter
checkUnique(_newOwners);
require(_newOwners[i] != _newOwners[i]);
owners.push(_newOwners[i]);
在 Solidity 中利用引用范例的时候,必需指定命据的位置, 关于数据位置,可以阅读登链社区翻译的Solidity文档-引用范例[1]
contract C {
address[] owners;
以下是一段示例利用 calldata 的 代码:
function checkUnique(address[] calldata _newOwners) internal pure {
}
for (uint i = 0; i < _newOwners.length; i++)
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。