Solidity函数中pure、view、constant的用法

1.solidity为函数提供了四种访问权限:public,internal,private,external
  • public:公共函数,内部正常访问,外部正常访问,子类可以继承
  • internal:内部函数,内部正常访问,外部无法访问,子类可以继承
  • private: 私有函数,内部正常访问,外部无法访问,子类无法继承
  • external: 外部函数,内部不能访问,外部正常访问,子类可继承
2.solidity函数的格式为:

function 函数名(参数) public|private|internal|external pure|view|constant 无返回值|returns (返回值类型)。

pragma solidity ^0.5.0;

contract math{
    // int uint
    
    uint numa = 100;
    uint numb = 200;
    
    // uint numc = 2;
    
    // function add() view public returns(uint){
    //     return numa + numb;
    // }
    
    function add(uint a, uint b) pure public returns(uint){
        return a+b;
    }
    
    
    function sub(uint a, uint b) pure public returns(uint){
        return a-b;
    }
    
    function mul(uint a, uint b) pure public returns(uint){
        return a*b;
    }
    
    function div(uint a, uint b) pure public returns(uint){
        return a/b;
    }
    
    function mod(uint a, uint b) pure public returns(uint){
        return a%b;
    }
    
    function squ(uint a,uint b) pure public returns(uint){
        return a**b;
    }
    
    uint8 a = 3;
    uint8 b = 4;
    
    function weiyu() view public returns(uint){
        return a&b;
    }

    function weihuo() view public returns(uint){
        return a|b;
    }
        
    function weifan() view public returns(uint){
        return ~a;
    }
    
    function weiyihuo() view public returns(uint){
        return a^b;
    }
    
    function zuoyi() view public returns(uint){
        return a<<1;
    }
        
    function youyi() view public returns(uint){
        return a>>1;
    }
}
  • 当函数有返回值,函数中正常来讲需要有 pure|view|constant关键字 如果没有返回值,在调用函数过程中,需要主动去调用底层的call()方法。当函数返回值为全局变量或属性时,可以使用view或者constant view可以理解成constant的新版本,可以简单理解成他们俩等价pure 。如果只是纯粹的返回一个值,直接使用pure反之,使用view或者constant即可。

  • 在Solidity中constant、view、pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),因为不需要矿工来验证,所以用好这几个关键词很重要!

  • 这三个关键词有什么区别和联系,简单来说,在Solidity v4.17之前,只有constant,后来有人嫌constant这个词本身代表变量中的常量,不适合用来修饰函数,所以将constant拆成了view和pure。view的作用和constant一模一样,可以读取状态变量但是不能改;pure则更为严格,pure修饰的函数不能改也不能读状态变量,否则编译通不过。

参考:
[1] http://shaolinbit.com/2018/02/06/blockchain-solidity-qx/
[2] https://www.cnblogs.com/huahuayu/p/8604873.html

你可能感兴趣的:(区块链)