可见性和 getter 函数
状态变量的可见性
- public: 内部、被继承的子合约、外部均可见
- internal: 在合约内部和被继承的子合约都可见
- private: 只在当前合约内部可见
函数的可见性
- external: 仅在合约外部可见,当前合约内部不可见
- public: 内部、被继承的子合约、外部均可见
- private: 只在当前合约内部可见
- internal: 在合约内部和被继承的子合约都可见
getter 函数
- 编译器自动为所有 public 状态变量创建 getter 函数。
- getter 函数具有外部(external)可见性。
- 如果你有一个数组类型的 public 状态变量,那么你只能通过生成的 getter 函数访问数组的单个元素。如果要在一次调用中返回整个数组,则需要写一个函数,例如:
contract arrayExample {
// public state variable
uint[] public myArray;
// 返回整个数组
function getArray() public view returns (uint[] memory) {
return myArray;
}
}
getter 函数: 结构体中的数组和映射
pragma solidity ^0.4.0 <0.9.0;
contract Complex {
struct Data {
uint a;
bytes3 b;
mapping (uint => uint) map;
uint[3] c;
uint[] d;
bytes e;
}
mapping (uint => mapping(bool => Data[])) public data;
}
这将会生成以下形式的函数,在结构体内的映射和数组(byte 数组除外)被省略了,因为没有好办法为单个结构成员或为映射提供一个键。
function data(uint arg1, bool arg2, uint arg3)
public
returns (uint a, bytes3 b, bytes memory e)
{
a = data[arg1][arg2][arg3].a;
b = data[arg1][arg2][arg3].b;
e = data[arg1][arg2][arg3].e;
}