企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 访问函数(Getter Functions) 编译器为自动为所有的`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`初始化被省略了,因为并没有一个很好的方式来对键赋值。