使用圆括号而不是方括号访问 Solidity 映射?
Solidity mapping access with parentheses instead of square brackets?
我想知道 Moloch v2.1 智能合约代码中的特定语句:
https://github.com/Moloch-Mystics/Molochv2.1/blob/main/Flat_Moloch_v2.1.sol
在Moloch
合约中,有一个名为members
的合约级映射
mapping(address => Member) public members;
正如预期的那样,几乎每一行读取或写入此映射的代码都使用了方括号。然而,有一行代码涉及一个使用圆括号的元组,将一对圆括号包裹在 msg.sender
:
周围
(,,,bool exists,,) = moloch.members(msg.sender);
为什么这行代码在 moloch.members 引用之后不使用方括号,像这样?:
(,,,bool exists,,) = moloch.members[msg.sender];
我不明白为什么该行使用括号,以及这可能会导致什么样的不同行为。有人可以给我解释一下吗?
出于参考目的,这发生在下面的函数内部,它是 MolochSummoner
合约的成员,继承自 CloneFactory
:
function registerDao(
address _daoAdress,
string memory _daoTitle,
string memory _http,
uint _version
) public returns (bool) {
moloch = Moloch(_daoAdress);
(,,,bool exists,,) = moloch.members(msg.sender);
require(exists == true, "must be a member");
require(daos[_daoAdress] == false, "dao metadata already registered");
daos[_daoAdress] = true;
daoIdx = daoIdx + 1;
emit Register(daoIdx, _daoAdress, _daoTitle, _http, _version);
return true;
}
如果您在同一个合约中访问变量,则只能使用方括号。
在合同之外,当访问 public 变量时,您正在调用 getter 函数 members()
。 Solidity 会自动为您生成此函数。没有 get
前缀。
这是一个有点令人困惑且有些糟糕的设计决定,所以我深表歉意。
我想知道 Moloch v2.1 智能合约代码中的特定语句:
https://github.com/Moloch-Mystics/Molochv2.1/blob/main/Flat_Moloch_v2.1.sol
在Moloch
合约中,有一个名为members
mapping(address => Member) public members;
正如预期的那样,几乎每一行读取或写入此映射的代码都使用了方括号。然而,有一行代码涉及一个使用圆括号的元组,将一对圆括号包裹在 msg.sender
:
(,,,bool exists,,) = moloch.members(msg.sender);
为什么这行代码在 moloch.members 引用之后不使用方括号,像这样?:
(,,,bool exists,,) = moloch.members[msg.sender];
我不明白为什么该行使用括号,以及这可能会导致什么样的不同行为。有人可以给我解释一下吗?
出于参考目的,这发生在下面的函数内部,它是 MolochSummoner
合约的成员,继承自 CloneFactory
:
function registerDao(
address _daoAdress,
string memory _daoTitle,
string memory _http,
uint _version
) public returns (bool) {
moloch = Moloch(_daoAdress);
(,,,bool exists,,) = moloch.members(msg.sender);
require(exists == true, "must be a member");
require(daos[_daoAdress] == false, "dao metadata already registered");
daos[_daoAdress] = true;
daoIdx = daoIdx + 1;
emit Register(daoIdx, _daoAdress, _daoTitle, _http, _version);
return true;
}
如果您在同一个合约中访问变量,则只能使用方括号。
在合同之外,当访问 public 变量时,您正在调用 getter 函数 members()
。 Solidity 会自动为您生成此函数。没有 get
前缀。
这是一个有点令人困惑且有些糟糕的设计决定,所以我深表歉意。