使用圆括号而不是方括号访问 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 前缀。

这是一个有点令人困惑且有些糟糕的设计决定,所以我深表歉意。