1. 程式人生 > >Solidity語言學習——(三)

Solidity語言學習——(三)

智慧推斷:

使用var關鍵字時,第一次賦值給變數,編譯器會自動推斷變數的型別,而且推斷後不能更改這個變數的型別了,如果更改了就會出錯,還有就是不能在函式引數中使用。注意:有時候var會推斷出一個錯誤的型別。

案例:

pragma solidity ^0.4.18;

contract Var{
    
    function vardemo() view returns(bool){
        var a = true;
        return a;
    }   
}

結果為:

solidity中var 推斷型別時,遵循就地最小的原則,也就是說,推斷uint型別時,它會預設選擇最小的。

案例:

pragma solidity ^0.4.18;

contract Var{
    
    function vardemo() view returns(uint){
        var a = 7 ;
        a=256;
        return a;
    }   
}

這樣的話,就會報錯:

之後賦值的資料在 這個型別以內就可以。。

var可以將函式賦值給一個變數

pragma solidity ^0.4.18;

contract Var{
    
    function vardemo() view returns(bool){
        var a = true ;
        return a;
    }   
    function vardemo2() view returns(bool){
    var b=vardemo;
    return b();
    }
}

16進位制

16進位制字面量:比如Address型別定義的地址就是16進位制。

特點:hexencodingto...函式,以關鍵字hex開頭,後面跟一些字串,比如hex"001122"

案例:

contract Hex{
    function hexdemo()view returns(string){
        var a=hex"00112233";
        return a;
    }
}

16進位制與bytes轉換,轉換完成後也可以通過下標來取其指定的元素值。

案例:

contract Hex{
    function hexdemo()view returns(string){
        var a=hex"00112233";
        return a;
    }
    
    function hexdemo1()view returns(bytes4,bytes1,bytes1){
        
        bytes4 a=hex"00112233";
        return (a,a[0],a[3]);
    }
    
}

常量和變數

常量:在solidity中,並不是所有的的型別都支援常量,只有值型別與string型別支援。

 string constant a ="wek";

常量定義時要注意需要宣告資料型別。

變數

        變數位置:

                  memory:儲存在記憶體中

                  storage:永久儲存在區塊鏈上

                  calldata:不用再程式中指定,只要是calldata中的資料,它都是隻讀的,並不持久化到區塊鏈上,一般在外部函式才會指定。

     儲存位置說明:狀態變數預設儲存在storage上面,函式中的區域性變數也會儲存在storage上面,函式的引數和返回值會儲存在memory上面。

資料位置轉換:

memory ->memory     引用傳遞,會改變其源資料的值。

memory->storage        不會改變源資料的值。

storage->memory    資料拷貝 會改變源資料的值。

storage->storage     會改變源資料的值。

contract dataLocal{
    uint[5] x = [1,2,3,4,5];
    uint[5] y;
    // 1.	memory->memory
    function gmemory() view public returns(uint[5]){
        uint[5] memory s = x;
        fmemory(s);
        return s;
    }

    function fmemory(uint[5] y) {
        y[0] = 30;
    }
    // 2.	memory->storage
    function mToS() view public returns(uint[5]) {
        uint[5] memory s = x;
        y = s;
        y[0] = 100;
        return s;
    }
    // 函式裡面的變數,會直接引發錯誤,因為這本身是一個非法操作
    function inFunc(uint[] x) {
        uint[] y;
        y = x;
    }
    // 3.	storage->storage
    function St(uint[5] storage y) internal {
        y[0] = 20;
    }
    function g() view returns(uint[5]) {
        St(x);
        return x;
    }
    // 4.	storage->memory

}

列舉

特點:使用者的自定義型別,,列舉可以顯示的與整形進行轉換,顯示的轉換會在執行時檢測數值範圍,如果範圍不匹配會引發異常,列舉型別至少要有一個成員。

預設從0開始,注:不能與整型進行隱式的轉換。

enum主要描述產品是否用過(new,used)

enum ProductCondition{

        New,
        Used
        
    }

案例:

該例項結合struct和enum,生成struct物件,在生成struct物件的過程中使用enum型別:

pragma solidity ^0.4.13;

contract Store{
    
    struct Product{
        
        ProductCondition condition;
        
    }
    
    enum ProductCondition{
        New,
        Used
        
    }
    

    function getProductCondition() public pure returns (ProductCondition){
      
        
        Product memory product = Product(ProductCondition.Used);


        return   product.condition;
        
    }
    
    
}

從這個例項可以看出,如果構建Product結構體傳入ProductCondition.Used則返回1,ProductCondition.New返回0