Cover photo

Solidity 课程3:函数类型

solidity函数的表达通式:

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

1、{internal|external}

{internal|external|public|private} :函数可见性说明符,一共4种。

  • public: 内部外部均可见,并且自动给stoage变量生成 getter 函数

  • private: 只能从本合约内部访问,继承的合约也不能用;

  • external: 只能从合约外部访问(但是可以用this.f()来调用,f是函数名);

  • internal: 只能从合约内部访问,继承的合约可以用;

    // private: 内部
    function privateCall() private {
        number = number - 1;
    }

    // internal: 内部
    function internalCall() internal {
        number = number - 1;
    }

    // 合约内的函数可以调用内部函数
    function externalCall() external {
        internalCall();
    }

    // 合约内的函数可以调用内部函数
    function publicCall() public {
        internalCall();
    }

    function testCall() public{
        privateCall();
        internalCall();
        this.externalCall();
    }

2、[pure|view|payable]

决定函数权限/功能的关键字。

payable的函数,运行的时候可以给合约转入ETH。

pureview,合约的状态变量存储在链上,gas fee很贵,如果不改写这些变量,就不用付gas。调用pure跟view的函数是不需要付gas的。

  • pure,不能读取也不能写入存储在链上的状态变量

  • view,能读取但也不能写入状态变量

  • 不写pure也不写view,函数既可以读取也可以写入状态变量

    //pure view payable
    // 默认
    function add() external{
        number = number + 1;
    }

    // pure
    function pureAdd(int paraNumber) external pure returns(int newNumber){
        // number = number + 1;//报错,无法访问number
        newNumber = paraNumber + 1;//报错,无法访问number
    }

    // view
    function viewAdd(int paraNumber) external view returns(int newNumber){
        // number = number + 1;//报错,无法改写number
        newNumber = number + paraNumber + 1;//报错,无法访问number
    }
   // payable: 递钱,能给合约支付eth的函数
    function minusPayable() external payable returns(uint256 balance) {
        internalCall();    
        balance = address(this).balance;
    }

3、[returns ()]

函数返回的变量类型和名称。

// pure
function pureAdd(int paraNumber) external pure returns(int newNumber){
    newNumber = paraNumber + 1;//报错,无法访问number
}

//return
function returnFunc() external view returns(int returnNum){
   int testNum = this.pureAdd(3) + 1;
   returnNum += testNum;
}

4、重载

函数支持重载,即名字相同但输入参数类型不同的函数可以同时存在,他们被视为不同的函数。

function saySomething() public pure returns(string memory){
    return("Nothing");
}

function saySomething(string memory something) public pure returns(string memory){
    return(something);
}

总结

这节介绍了函数的可见性说明、功能权限和返回值的使用,下节我们介绍变量的数据存储和作用域。

全部代码

https://github.com/Luca-Hsu/SuperSolidity/blob/main/03_Function/Function.sol

Reference:

https://mirror.xyz/ninjak.eth/FWI887JBea4VpNiMlJ2ICyJ5aWUREReGo9Bz0X8iEVc