链客,专为开发者而生,有问必答!

此文章来自链客区块链技术问答社区,未经允许拒绝转载。

下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及Solidity提供的对函数调用时的可见性控制语法。

一、调用方式

Solidity封装了两种函数的调用方式internal和external。

internal

internal调用,实现时转为简单的EVM跳转,所以它能直接使用上下文环境中的数据,对于引用传递时将会变得非常高效(不用拷贝数据)。

在当前的代码单元内,如对合约内函数,引入的库函数,以及父类合约中的函数直接使用即是以internal方式的调用。我们来看个简单的例子:

pragma solidity ^0.4.0;

contract Test {

function f(){}//以`internal`的方式调用function callInternally(){f();}

}

在上述代码中,callInternally()以internal的方式对f()函数进行了调用。

external

external调用,实现为合约的外部消息调用。所以在合约初始化时不能external的方式调用自身函数,因为合约还未初始化完成。下面来看一个以external方式调用的例子:

pragma solidity ^0.4.0;

contract A{

function f(){}

}

contract B{

//以`external`的方式调用另一合约中的函数function callExternal(A a){a.f();}

}

虽然当前合约A和B的代码放在一起,但部署到网络上后,它们是两个完全独立的合约,它们之间的方法调用是通过消息调用。上述代码中,在合约B中的callExternal()以external的方式调用了合约A的f()。

external调用时,实际是向目标合约发送一个消息调用。消息中的函数定义部分是一个24字节大小的消息体,20字节为地址,4字节为函数签名。

this

我们可以在合约的调用函数前加this.来强制以external方式的调用。需要注意的是这里的this的用法与大多数语言的都不一致。

pragma solidity ^0.4.0;

contract A{

function f() internal{}function callInternally(){f();}//以`external`的方式调用//f()只能以`internal`的方式调用//Untitled3:7:9: Error: Member "f" not found or not visible after argument-dependent lookup in contract Afunction callExternally(){//this.f();}

}

调用方式说明

上面所提到的internal和external指的函数调用方式,请不要与后面的函数可见性声明的external,public,internal,private弄混。声明只是意味着这个函数需要使用相对应的调用方式去调用。后续说明中会用以某某方式调用,来强调是对调用方式的阐述以加以区分。

二、函数的可见性

Solidity为函数提供了四种可见性,external,public,internal,private。

external

声明为external的可以从其它合约或通过Transaction进行调用,所以声明为external的函数是合约对外接口的一部分。

不能以internal的方式进行调用。

有时在接收大的数据数组时性能更好。

pragma solidity ^0.4.5;

contract FuntionTest{

function externalFunc() external{}function callFunc(){//以`internal`的方式调用函数报错//Error: Undeclared identifier.//externalFunc();//以`external`的方式调用函数this.externalFunc();}

}

声明为external的externalFunc()只能以external的方式进行调用,以internal的方式调用会报Error: Undeclared identifier.。

public

函数默认声明为public。

public的函数既允许以internal的方式调用,也允许以external的方式调用。

public的函数由于被外部合约访问,是合约对外接口的一部分。

pragma solidity ^0.4.5;

contract FuntionTest{

//默认是public函数function publicFunc(){}function callFunc(){//以`internal`的方式调用函数publicFunc();//以`external`的方式调用函数this.publicFunc();}

}

我们可以看到声明为public的publicFunc()允许两种调用方式。

internal

在当前的合约或继承的合约中,只允许以internal的方式调用。

pragma solidity ^0.4.5;

contract A{

//默认是public函数function internalFunc() internal{}function callFunc(){//以`internal`的方式调用函数internalFunc();}

}

contract B is A{

//子合约中调用function callFunc(){internalFunc();}

}

上述例子中声明为internal的internalFunc()在定义合约,和子合约中均只能以internal的方式可以进行调用。

private

只能在当前合约中被访问(不可在被继承的合约中访问)。

即使声明为private,仍能被所有人查看到里面的数据。访问权限只是阻止了其它合约访问函数或修改数据。

pragma solidity ^0.4.5;

contract A{

//默认是public函数function privateFunc() private{}function callFunc(){//以`internal`的方式调用函数privateFunc();}

}

contract B is A{

//不可调用`private`function callFunc(){//privateFunc();}

}

上述例子中,声明为private的privateFunc()只能在定义的合约中以internal的方式进行调用。

Solidity基础入门知识(十)函数的访问权限和可见性相关推荐

  1. Solidity基础入门知识(八)结构体structs

    自定义结构体 pragma solidity ^0.4.4;contract Students {struct Person {uint age;uint stuID;string name;}} P ...

  2. Python基础入门知识(2)

    接前面的文章: Python基础入门知识(1) Python基础入门教学 2 Python的基础知识 2.2 数据类型 2.2.2 数值类型 2.2.2.1 整数 2.2.2.2 浮点数 2.2.2. ...

  3. Swift基础入门知识学习(12)-枚举(列举)-讲给你懂

    TED演讲的8个秘诀:学习18分钟高效表达-重点笔记 Swift基础入门知识学习(11-2)-閉包-第二篇-讲给你懂 目录 枚举(列举)语法 使用 Switch 语句匹配枚举(列举)值 相关值 原始值 ...

  4. 自己总结的MySQL基础入门知识,附思维导图

    第一次写博文,问题点可能比较多,辛苦大家帮忙指正,感谢大家. MySQL基础入门知识 前言 一.数据库基础知识 1.什么是数据库 2.数据库的分类 3.数据库的常用语言 4.数据库的常用操作方式 5. ...

  5. 学python需要什么基础知识-学习Python需要知道哪些基础入门知识?

    众所周知,Python以优雅.简洁著称,入行门槛低,可以从事Linux运维.Python Web网站工程师.Python自动化测试.数据分析.人工智能等职位!就目前来看,Python就业前景广阔.很多 ...

  6. 数据结构基础入门知识

    数据结构基础入门知识 ------ 数据结构:理解和练习 <异类-不一样的成功启示录> IP/26 192 IP/25 128 IP/24 192. 128 64  32 16  2  1 ...

  7. swap函数_[C++基础入门] 6、函数

    点击上方 蓝字 关注我呀! [C++基础入门] 6.函数 文章目录 6 函数 6.1 概述 6.2 函数的定义 6.3 函数的调用 6.4 值传递 6.5 函数的常见样式 6.6 函数的声明 6.7 ...

  8. bili—Excel零基础入门进阶到函数

    Excel零基础入门进阶到函数 1. excel入门 2. 表格设计&自动加总函数 3.冻结表格栏&拆分视窗 4. 资料排序 5. 数据筛选 1. excel入门 每个单元格都有自己的 ...

  9. 罗马音平假名中文可复制_日语零基础入门五十音,日语零基础五十音图表

    日语零基础入门五十音,日语入门的最基本要求就是记住五十音图,但是这个记住不仅是你能背下来或是默写下来.而是你需对号入座! 下面是一张五十音图表. 即每个假名单独拿出来你要立马反应出来怎么读.其重要性甚 ...

最新文章

  1. 检测未定义的对象属性
  2. 一些常见去除恶意软件的东东
  3. 浅谈ICMP Flood***原理
  4. Java 7的类型推断
  5. pip安装deb_技术|如何在 Ubuntu 上安装 pip
  6. C#常用类库----CSV文件操作类
  7. c语言 指针_C语言野指针以及非法内存操作
  8. 【转】 UDK 全版本安装文件下载
  9. 一文带你了解 Java 中的锁
  10. 组态王怎么做超级曲线_组态王显示数据并绘制曲线
  11. 怎样设置网络工作组计算机,如何建立计算机工作组?
  12. Ubuntu18.04 安装运行windows程序(qq 微信 caj阅读器等)+解决wine中文乱码
  13. java中重命名文件夹名,【Java】对文件或文件夹进行重命名
  14. 操作系统中怎么预防死锁呢?简单列举几种方法!
  15. [No00002A]26个英语字母的原始象形意义、含义、产生及发展历史
  16. Ubuntu Desktop 更改默认应用程序 (Videos -> SMPlayer)
  17. 《牛津字典精华总结》- 初阶系列 - 字母 - B
  18. [华为机试真题]69.姓名的夫妻相
  19. 硅谷印度工程师越来越多,把种姓歧视也带来了
  20. 响应式织梦模板日化食品零食类网站

热门文章

  1. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...
  2. 线性表List的基本创建
  3. 云开发使用 got 的 get/post 传参请求示例代码
  4. JS根据两点的经纬度坐标得到驾车行驶距离
  5. [微信小程序]星级评分和展示(详细注释附效果图)
  6. 用加密货币连接业务的6种方法
  7. K-Means聚类算法原理
  8. 长连接及在Node中的应用——HTTP/1.1 keep-alive
  9. 云计算时代,如何选择适合自己的云服务器厂商?
  10. 【Java学习笔记之五】java数组详解