# 訪問函數(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智能合約文件結構
- 智能合約源文件的基本要素概覽
- 值類型
- 類型
- 布爾
- 整型
- 地址
- 字節數組
- 小數
- 字符串
- 十六進制字面量
- 枚舉
- 函數
- 引用類型
- 引用類型
- 數據位置
- 數組
- 數據結構
- 雜項
- 映射
- 左值運算符
- 類型間的轉換
- 類型推斷
- 單位
- 貨幣單位
- 時間單位
- 語言內置特性
- 特殊變量及函數
- 數學和加密函數
- 地址相關
- 進階
- 入參和出參
- 控制結構
- 函數調用
- 創建合約實例
- 表達式的執行順序
- 賦值
- 作用范圍和聲明
- 異常
- 內聯匯編
- 合約詳解
- 合約
- 可見性或權限控制
- 訪問函數
- 函數修改器
- 常狀態變量
- 回退函數
- 事件
- 繼承
- 接口
- 其它
- 庫
- 狀態變量的存儲模型
- 內存變量的存局
- 調用數據的布局