1. 程式人生 > >solidity學習筆記(2)——狀態變數和函式可見性

solidity學習筆記(2)——狀態變數和函式可見性

因為Solidity有兩種函式呼叫:內部呼叫:不建立一個真實的EVM呼叫(也稱為“訊息呼叫”);外部的呼叫:要建立一個真實的EMV呼叫,

在智慧合約中,函式和狀態變數的可見性可以分為四種, public , private , internal 和 external ,函式預設可見性是 public ,狀態變數的預設可見性是 internal 。public - (任意訪問,作為合約介面)可以通過內部呼叫或通過訊息呼叫。對公共狀態變數而言,會有的自動訪問限制符的函式生成。private - (僅當前合約內)私有函式和狀態變數僅僅在定義該合約中可見, 在派生的合約中不可見。internal - (僅當前合約及所繼承的合約)這些函式和狀態變數只能內部訪問(即在當前合約或由它派生的合約),而不使用(關鍵字)this 。external

- (僅外部訪問,也是合約介面)它們可以從其他合約呼叫, 也可以通過事務呼叫。外部函式f不能被內部呼叫(在內部也只能用外部訪問方式訪問,即 f()不執行,但this.f()執行)。

案例:

pragma solidity ^0.4.4;
contract Animal {
    string _birthDay; // 生日
    int public _age; // 年齡
    int internal _weight; // 身高
    string private _name; // 姓名
​
    function Animal() {
      _age = 29;
      _weight = 170;
      _name = "Lucky dog";
      _birthDay = "2011-01-01";
    }
​
    function birthDay() constant returns (string) {
      return _birthDay;
    }
​
    function age() constant public returns (int) {
      return _age;
    }
    function height() constant internal returns (int) {
      return _weight;
    }
    function name() constant private returns (string) {
      return _name;
    }
}

結果分析: 1、為什麼沒有_birthDay?因為狀態變數預設的是internal,無法被外部檢視;而且狀態變數是不能設定external的。 2、為什麼會有_age函式?因為狀態變數_age被設定為public,此時會自動生產一個同名的getter函式,返回_age的值; 3、四個函式,只有看到birthDay和age,為什麼?因為birthDay預設的public,age被手動設定成public; 4、private和internal都是不能被外部看到的