# 访问函数(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`初始化被省略了,因为并没有一个很好的方式来对键赋值。
- Solidity语言
- 入门说明
- Solidity智能合约文件结构
- 智能合约源文件的基本要素概览
- 值类型
- 类型
- 布尔
- 整型
- 地址
- 字节数组
- 小数
- 字符串
- 十六进制字面量
- 枚举
- 函数
- 引用类型
- 引用类型
- 数据位置
- 数组
- 数据结构
- 杂项
- 映射
- 左值运算符
- 类型间的转换
- 类型推断
- 单位
- 货币单位
- 时间单位
- 语言内置特性
- 特殊变量及函数
- 数学和加密函数
- 地址相关
- 进阶
- 入参和出参
- 控制结构
- 函数调用
- 创建合约实例
- 表达式的执行顺序
- 赋值
- 作用范围和声明
- 异常
- 内联汇编
- 合约详解
- 合约
- 可见性或权限控制
- 访问函数
- 函数修改器
- 常状态变量
- 回退函数
- 事件
- 继承
- 接口
- 其它
- 库
- 状态变量的存储模型
- 内存变量的存局
- 调用数据的布局