1. 程式人生 > >solidity智慧合約[27]-函式與函式過載

solidity智慧合約[27]-函式與函式過載

函式的一般形式

1
function (<parameter types>) {public|internal|external} [pure|constant|view|payable] [returns (<return types>)]

函式的作用

1、與區塊鏈互動
2、本地執行
3、封裝程式碼

帶引數函式

1
2
3
4
5
6
7
uint public num;
string public name;

function setparam(uint _num,string _name) public {

    num  = _num;
    name = _name;
}

帶參函式呼叫—函式命名引數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
pragma solidity ^0.4.23;


contract funcParam{

   //狀態變數
   uint public num;
   string public name;
   //代餐函式

   function setparam(uint _num,string _name) public {
       num  = _num;
       name = _name;
   }

   //呼叫
   function Test() public {
       setparam(99,"bob");
   }

   //函式命名引數

     function Test2() public {
       setparam({_num:99,_name:"bob"});
   }

     function Test3() public {
       setparam({_name:"Alice",_num:999});
   }

   //錯誤程式碼,引數個數不匹配
   // function Test4() public {
   //     setparam(100);
   // }

}

函式過載

在一個合約中有相同名字的函式,就是函式的過載。
過載必須要函式的型別與長度都不相同。

下面的例子都是錯誤的寫法

錯誤1

1
2
3
4
5
6
7
function  fun(){

}

function  fun(){

}

錯誤2

1
2
3
4
5
6
7
function  fun() returns(uint){

}

 function  fun() returns(bytes1){

}

錯誤3

1
2
3
4
5
6
7
  function  fun() returns(uint){

}

function  fun(){

}

正確1

1
2
3
4
5
6
7
function  fun(uint k) public pure{

}

function  fun() public pure{

}

正確2

1
2
3
4
5
6
7
function  fun2(uint a) public pure{

}

function  fun2(bytes1 b) public pure{

}

例子剖析1

在下面的例子中,fun3有兩個過載的函式。函式test不能夠呼叫fun3(2),因為不能夠明確到底是要呼叫哪一個。
fun3(256)能夠執行成功。因為256超過了int8的最大值,只能夠呼叫fun3(uint a). 如果想明確,可以強制的轉換,例如uint256(2)。

1
2
3
4
5
6
7
8
9
10
11
12
13
function  fun3(uint a) public {
 num = 256;
}

function  fun3(uint8 b) public{
  num = 8;
}

function test() public{
 //fun3(2);錯誤,不明確
 fun3(256);
   fun3(uint256(2));
}

image.png