访问函数(Getter Functions)
优质
小牛编辑
130浏览
2023-12-01
编译器为自动为所有的public
的状态变量创建访问函数。下面的合约例子中,编译器会生成一个名叫data
的无参,返回值是uint
的类型的值data
。状态变量的初始化可以在定义时完成。
pragma solidity ^0.4.0;
contract C{
uint public c = 10;
}
contract D{
C c = new C();
function getDataUsingAccessor() returns (uint){
return c.c();
}
}
访问函数有外部(external)可见性。如果通过内部(internal)的方式访问,比如直接访问,你可以直接把它当一个变量进行使用,但如果使用外部(external)的方式来访问,如通过this.
,那么它必须通过函数的方式来调用。
pragma solidity ^0.4.0;
contract C{
uint public c = 10;
function accessInternal() returns (uint){
return c;
}
function accessExternal() returns (uint){
return this.c();
}
}
在acessExternal
函数中,如果直接返回return this.c;
,会出现报错Return argument type function () constant external returns (uint256) is not implicitly convertible to expected type (type of first return variable) uint256.
。原因应该是通过外部(external)的方式只能访问到this.c
作为函数的对象,所以它认为你是想把一个函数转为uint
故而报错。
下面是一个更加复杂的例子:
pragma solidity ^0.4.0;
contract ComplexSimple{
struct Cat{
uint a;
bytes3 b;
mapping(uint => uint) map;
}
//
mapping(uint => mapping(bool => Cat)) public content;
function initial(){
content[0][true] = Cat(1, 1);
content[0][true].map[0] = 10;
}
function get() returns (uint, bytes3, uint){
return (content[0][true].a, content[0][true].b, content[0][true].map[0]);
}
}
contract Complex {
struct Data {
uint a;
bytes3 b;
mapping (uint => uint) map;
}
mapping (uint => mapping(bool => Data[])) public data;
}
文档中自带的的这个Demo始终跑不通,数组类型这里不知为何会抛invalid jump
。把这块简化了写了一个ComplextSimple
供参考。
需要注意的是public
的mapping
默认访问参数是需要参数的,并不是之前说的访问函数都是无参的。
mapping
类型的数据访问方式变为了data[arg1][arg2][arg3].a
结构体(struct)
里的mapping
初始化被省略了,因为并没有一个很好的方式来对键赋值。