solidity文档--函数调用方式

solidity封装了两种函数的调用方式:internal和external,下面将具体介绍这两种调用方式的区别

1. internal

internal调用,即内部调用,不创建一个真实的EVM调用(消息调用),可以直接引用合约内的数据。在当前的代码单元内,如调用当前合约内定义的函数、引入库的函数以及继承的父合约内的函数可以以internal的方式直接调用,例如:

pragma solidity ^0.4.0;

contract Test{
    function f(){}

    function callInternally(){
        f();
    }
}

在上面这段代码内,callInternally()函数调用了当前合约内的另一个函数f(),这种调用方式便是internal内部调用

2. external

external调用,即外部调用,也就是说从合约外部调用,会创建一个EVM调用(发起消息调用)。因此在合约初始化的时候不能以external的方式调用当前合约内的函数,因为合约还未初始化,例如:

pragma solidity ^0.4.0

contract A{
    function f(){}
}

contract B{
    function callExternal(A a){
        a.f();
    }
}

上面这段代码中,B合约内的callExternally()函数中使用a.f()的方式(a是合约A的一个实例)调用了当前合约外部的函f(),这种调用方式便是external外部调用

3. this

我们之前说过solidity中封装了两种调用函数的方式:external和internal,那么这里为什么会出现第三种呢?其实this是强制external调用方式,也就是说在当前合约内可以在调用函数前加上this.来强制调用当前和合约内的函数,例如:

pragma solidity ^0.4.0;

contract A{
    function f() internal{}

    function callInternally(){
        f();
    }

    function callExternally(){
        this.f();
    }
}

上面这段代码中,合约A中的函数f()已经声明了internal,说明只能内部调用,因此合约A中的函数callInternally()是可以正常调用函数f()的,但是合约A中的另一个函数callExternally()则是通过this.f()的方法强制使用外部调用,这样运行时便会报错。

你可能感兴趣的:(智能合约,区块链,solidity,函数调用)