solidity學習筆記(2)——狀態變數和函式可見性
阿新 • • 發佈:2018-12-15
因為Solidity有兩種函式呼叫:內部呼叫:不建立一個真實的EVM呼叫(也稱為“訊息呼叫”);外部的呼叫:要建立一個真實的EMV呼叫,
在智慧合約中,函式和狀態變數的可見性可以分為四種, public , private , internal 和 external ,函式預設可見性是 public ,狀態變數的預設可見性是 internal 。public - (任意訪問,作為合約介面)可以通過內部呼叫或通過訊息呼叫。對公共狀態變數而言,會有的自動訪問限制符的函式生成。private - (僅當前合約內)私有函式和狀態變數僅僅在定義該合約中可見, 在派生的合約中不可見。internal - (僅當前合約及所繼承的合約)這些函式和狀態變數只能內部訪問(即在當前合約或由它派生的合約),而不使用(關鍵字)this 。external
案例:
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都是不能被外部看到的