solidity第三课——函数类型

 一,solidity中的函数 基本格式是:

function (HelloSolidity) [internal|external] [pure|view|payable] returns (string){
}
  1. function:声明函数时的固定用法,想写函数,就要以function关键字开头。

  2. (HelloSolidity):圆括号里写函数的参数,也就是要输入到函数的变量类型和名字。

  3. {internal|external|public|private}:函数可见性说明符,一共4种。没标明函数类型的,默认internal

    • public: 内部外部均可见。(也可用于修饰状态变量,public变量会自动生成 getter函数,用于查询数值).
    • private: 只能从本合约内部访问,继承的合约也不能用(也可用于修饰状态变量)。
    • external: 只能从合约外部访问(但是可以用this.f()来调用,f是函数名)
    • internal: 只能从合约内部访问,继承的合约可以用(也可用于修饰状态变量)。
  4. [pure|view|payable]:决定函数权限/功能的关键字。payable(可支付的)很好理解,带着它的函数,运行的时候可以给合约转入ETH

  5. returns(string):函数返回的变量类型和名称。(此处是字符串)

 二,函数的修饰符  pure和view

我刚开始学solidity的时候,一直不理解pure和view关键字,因为别的语言没有类似的关键字。solidity加入这两个关键字,编出程序也要注重gas fee的节省,要不然写出的项目,会因为gas的原因而凉。合约的状态变量存储在链上,gas free很贵,如果不改写链上变量,就不用付gas。调用pure和view的函数是不需要付gas的。

函数实际上没有改变solidity的状态,即没有改变任何值和任何东西,这种情况下,我们可以把函数定义成view,意味着它只能读取数据不能更改数据。

function HelloSolidity() public view returns(string){}

同样支持pure函数,表明不能读取也不能写入存储在链上的状态变量。

不写pure和view即函数既可以读取也可以写入状态变量。接下来直接看代码吧!

// SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    contract FunctionTypes{
        uint256 public number = 5;

    function add() external{
        number = number + 1;
    }

如果add()函数是function add() pure external returns(),就会报错,因为pure不能读取也不能写入,pure还是有很大用处的。例如我们此处可以换一种来写。

function addPure(uint256 _number) external pure returns(uint256 new_number){
        new_number = _number+1;
    }

即传递参数_number,让_number+1。

如果add()函数是function add()  external view retruns(),这也会报错,因为view可以读取但不能写入。这里我们可以改代码即不改值,而返回新变量。

function addView() external view returns(uint256 new_number) {
        new_number = number + 1;
    }

三,函数的可见性——internal(内)和external(外)

interal和private类似,不过如果某个合约继承自其父合约,这个合约就可以访问父合约,同样的也可访问其内部函数。external和public类似,只不过这些函数只能在合约之外调用,他们不能被合约内的其他函数调用。

猜你喜欢

转载自blog.csdn.net/qq_52708261/article/details/126860726