getter访问器
作用:
对于所有public的状态变量,Solidity语言编译器,提供了自动为状态变量生成对应的getter(访问器)的特性
在合约内,我们可以直接操作及访问data状态变量,但在合约外我们只能用data()的方式来访问。另外,在合约内,我们不能直接访问data(),因为访问器函数的可见性是external。
直观版:
(1)合约内访问public状态变量a-----------------------> 直接用a即可 【可set】【可访问】
(2)合约外访问public状态变量a-----------------------> 用a() 【只能访问】
(3)状态变量所创建的访问器函数,与变量同名。
测试代码:
pragma solidity ^0.4.0;
contract AccessGetter{
uint public data = 10;
function f() returns (uint, uint){
//合约内访问
return (data, this.data());
}
}
contract SetVar{
function f(AccessGetter accessget) returns (uint){
//合约外访问 external的方式访问
return (accessget.data());
}
}
下对于非基本类型类型的状态变量进行举例:
1、枚举
枚举的访问器与基本类型类似,均是生成与状态变量同名的函数。
pragma solidity ^0.4.0;
contract EnumGetter{
enum Color{Blue, Green, Yellow}
Color public color = Color.Green;
function f() returns (Color, Color){
return (color, this.color());
}
}
2、数组
数组的访问器要带参数,以表示数组的下标
测试代码:
(1)一维变长数组
pragma solidity ^0.4.0;
contract ArrayGetter{
uint[] public arr = new uint[](1);
function f() returns (uint, uint){
//直接访问与以带序号参数访问器的方式访问
return (arr[0], this.arr(0));
}
}
(2)多维数组
pragma solidity ^0.4.0;
contract ArrayGetter{
//定义一个长度为3,每个元素都是变长数组的数组
uint[][3] public arr;
function f() returns (uint,uint){
//直接访问与以带序号参数访问器的方式访问
arr[0].push(2);
return (arr[0][0],this.arr(0,0));
}
}
3、映射
显而易见,跟数组差不多的操作。
对于映射类型,它的访问器也是有参数的,参数为映射定义的键类型。
测试代码:
pragma solidity ^0.4.0;
contract MappingGetter{
mapping(uint => uint) public data;
function f() returns (uint, uint){
data[25] = 100;
//直接访问,通过访问器访问
return(data[25], this.data(25));
}
}
4、结构体
结构体的访问器也是同名的函数。访问器返回结果是结构体中的每个变量。
pragma solidity ^0.4.0;
contract StructGetter{
struct S{
uint a;
string b;
bytes32 c;
}
S public s = S(10, "Hello",hex"1234");
function f() returns (uint, bytes32){
var (a, b, c) = this.s();
return (a, c);
}
}
5、注意事项?
Solidity不支持通过external的访问变长内容?
但是Remix则可以。。
牛刀小试:
阅读代码,不运行,求出下面代码返回的值:
pragma solidity ^0.4.0;
contract Complex {
struct Data {
uint a;
bytes3 b;
mapping (uint => uint) map;
}
mapping (uint => mapping(bool => Data[])) public data;
Data[] internal arr;
function f() returns (uint, bytes3){
Data memory d = Data(1, 0x123);
arr.push(d);
data[0][true] = arr;
return this.data(0, true, 0);
}
}
上述代码将返回
1
,0x000123
。