Solidity語言學習筆記————18、字串和函式

FLy_鵬程萬里發表於2018-06-21

字串:需要使用雙引號“”或者單引號’’括起來,例如:定義一個字串變數:string  name=“jake”;

string字串不能通過length方法獲得長度

十六進位制資料以關鍵字hex打頭,後面緊跟用單或雙引號包裹的字串。如hex"001122ff"。通過下面的例子來理解下是什麼意思:

contract HexLiteral{
    function test() returns (string){
      var a = hex"001122FF";

      //var b = hex"A";
      //Expected primary expression
      
      return a;
  }
}

由於一個位元組是8位,所以一個hex是由兩個[0-9a-z]字元組成的。所以var b = hex"A";不是成雙的字串是會報錯的。var型別會在後面的文章進行解釋。

十六進位制的字面量與字串可以進行同樣的類似操作(例如索引):

pragma solidity ^0.4.0;

contract HexLiteralBytes{
    function test() returns (bytes4, bytes1, bytes1, bytes1, bytes1){
      bytes4 a = hex"001122FF";

      return (a, a[0], a[1], a[2], a[3]);
  }
}
可以發現,它可以隱式的轉為bytes,上述程式碼的執行結果如下:
Result: "0x001122ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000"
Transaction cost: 21857 gas. 
Execution cost: 585 gas.
Decoded: 
bytes4: 0x001122ff
bytes1: 0x00
bytes1: 0x11
bytes1: 0x22
bytes1: 0xff

函式(function):函式有兩種型別,內部函式(internal)和外部函式(external),內部函式只能在當前合約的上下文內使用,外部函式允許使用到本合約之外的地方。函式的預設型別是內部函式,如果外部函式被本合約之外的環境呼叫,會自動轉換為bytes24型別,包括20位元組的函式所在地址和4位元組的函式方法簽名。

例子:

function abc(uint a) returns(uint){

                 return a;       
}

abc是函式名字,括號內是引數,如果沒有引數則括號內為空,returns是返回值,需要在括號內定義好返回值的型別,如果沒有返回值,則必須省略returns關鍵字。

通過一個例子來學習更多的變化情況:

contract FuntionTest{
    function internalFunc() internal{}

    function externalFunc() external{}

    function callFunc(){
        //直接使用內部的方式呼叫
        internalFunc();

        //不能在內部呼叫一個外部函式,會報編譯錯誤。
        //externalFunc();
        //Error: Undeclared identifier.

        //不能通過`external`的方式呼叫一個`internal`
        //Member "internalFunc" not found or not visible after argument-dependent lookup in contract FuntionTest
        //this.internalFunc();

        //使用`this`以`external`的方式呼叫一個外部函式
        this.externalFunc();
    }
}
contract FunctionTest1{
    function externalCall(FuntionTest ft){
        //呼叫另一個合約的外部函式
        ft.externalFunc();
        
        //不能呼叫另一個合約的內部函式
        //Error: Member "internalFunc" not found or not visible after argument-dependent lookup in contract FuntionTest
        //ft.internalFunc();
    }
}

解釋:函式internalFunc被定義為內部函式,可以直接呼叫。函式externalFunc被定義為外部函式,在本合約內直接呼叫會報錯,需要加上關鍵字this:this.externalFunc( )才可以。同時,在內部函式前加this函式會報錯,不能用外部函式的呼叫方法來呼叫內部函式。

呼叫另一個合約的外部函式格式:ft.externalFunc( ),   fx是另一個合約的名字,externalFunc是外部函式的名字。另一個合約的內部函式是不能被呼叫的,會報錯。


相關文章