Solidity语言学习——(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/The_Reader/article/details/83096151

智能推断:

使用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

猜你喜欢

转载自blog.csdn.net/The_Reader/article/details/83096151