2.1 函數形式
function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]
1. function:聲明函數時的固定用法图仓,想寫函數雅潭,就要以function關鍵字開頭揭厚。
2. <function name>:函數名。
3. (<parameter types>):圓括號里寫函數的參數扶供,也就是要輸入到函數的變量類型和名字筛圆。
4. {internal|external|public|private}:函數可見性說明符,一共4種椿浓。沒標明函數類型的太援,默認public。
- public: 內部外部均可見扳碍。
- private: 只能從本合約內部訪問提岔,繼承的合約也不能用。
- external: 只能從合約外部訪問(但是可以用this.f()來調用笋敞,f是函數名)碱蒙。
-
internal: 只能從合約內部訪問,繼承的合約可以用液样。
Note 1: 沒有標明可見性類型的函數振亮,默認為public。
Note 2:public|private|internal 也可用于修飾狀態(tài)變量鞭莽。 public變量會自動生成同名的getter函數坊秸,用于查詢數值。
Note 3:沒有標明可見性類型的狀態(tài)變量澎怒,默認為internal褒搔。
5. [pure|view|payable]:決定函數權限/功能的關鍵字。payable(可支付的)很好理解喷面,帶著它的函數星瘾,運行的時候可以給合約轉入ETH。pure和view的介紹見下一節(jié)惧辈。
6. [returns ()]:函數返回的變量類型和名稱琳状。
- 代碼示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract FunctionIntro {
function add(uint a, uint b) pure external returns (uint) {
return a + b;
}
function sub(uint a, uint b) pure external returns (uint c) {
return a - b;
}
}
2.2 pure和view
- pure: 不能讀取也不能寫入存儲在鏈上的狀態(tài)變量
- view: 能讀取但也不能寫入狀態(tài)變量
- 不包含view和pure: 既可以讀取也可以寫入狀態(tài)變量
狀態(tài)變量存儲在鏈上,更改鏈上狀態(tài)會消耗gas fee盒齿。對于不更改鏈上狀態(tài)的函數念逞,需要使用pure或者view標識困食,這類函數不會消耗gas fee。
在以太坊中翎承,以下語句被視為修改鏈上狀態(tài):
- 寫入狀態(tài)變量硕盹。
- 釋放事件。
- 創(chuàng)建其他合約叨咖。
- 使用selfdestruct.
- 通過調用發(fā)送以太幣瘩例。
- 調用任何未標記view或pure的函數。
- 使用低級調用(low-level calls)甸各。
- 使用包含某些操作碼的內聯匯編垛贤。
- 代碼示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract PureView {
uint public x = 100;
// pure函數:不更改也不讀取狀態(tài)變量
function pureFunc(uint _x) external pure returns (uint) {
return _x + 1;
}
// view函數:讀取狀態(tài)變量,但不更改
function viewFunc() external view returns (uint) {
return x;
}
// 不包含view和pure的函數:會更改狀態(tài)變量
function nFunc() external returns (uint) {
x += 1;
return x;
}
}