想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】
链客,有问必答!!

下面来继续介绍作为一个分布式网络语言所特有的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 A
function 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基础入门知识(十)函数的访问权限和可见性

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及So ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. ps基础入门知识课程教程学习文字设计制作小白

    ps基础入门知识课程教程学习文字设计制作小白

  9. 超完整 Python基础入门知识教程

    本书旨在帮助Python开发人员发现该语言和相关库的突出特性,并编写简单.流畅.易于阅读和易于维护的代码.特别是生成器.属性描述符(ORM的键)和Python表达式的对象在数据库处理过程中的具体应用: ...

  10. Swift基础入门知识学习(7)-字典-讲给你懂

    Swift基础入门知识学习(6)-数组(阵列)-讲给你懂 目录 声明字典 创建一个空字典 存取与修改字典 使用for-in遍历字典中的所有值 字典转换为数组 Swift字典(dictionary) 用 ...

最新文章

  1. 微软,您的.net为中国程序员带来了什么?
  2. 延迟加载算法微服务的模型
  3. Sublime Text 2 中文包
  4. php new static,PHP面向对象中new self( )和 new static( ) 的区别
  5. unity3d collider自动调整大小_自动网格组合建模工具Unity游戏素材资源
  6. 大屏做成这样,领导不重用你都难
  7. Oracle SQL存储过程结构、异常处理示例
  8. 【CF 应用开发大赛】智能静音android应用
  9. 大前端主题添加强力推荐和联系我们模块
  10. 华为网关服务器型号,02311CWM CN21ITGC SP212 I350-T4 华为服务器四口千兆网卡
  11. android 跨应用服务,跨应用启动Service,出现空指针
  12. 出差中,推荐几个百度,腾讯,抖音大佬的公众号
  13. (八)Grahpics之Blit
  14. 模型的评估指标(一)
  15. STM32的硬件I2C与AT24C16
  16. STM32F411 Discovery学习笔记(四)串口
  17. 亥姆霍兹线圈定义与应用
  18. Android Activity的隐式调用(跨进程)★
  19. ESIM模型详解与Keras代码实现
  20. Unity AssetBundle打包

热门文章

  1. zstuoj 4245 KI的斐波那契
  2. 【转】Javabyte[]数组和十六进制String之间的转换Util------包含案例和代码
  3. 程序员求职之道(《程序员面试笔试宝典》)之民间的企业排名的可信度到底有多大?...
  4. CentOS 7 常用命令
  5. HDU 1102 Constructing Roads
  6. Unix命令行程序和内建指令
  7. 博客“评论王”评选活动开始啦!
  8. .Net Core[译文]
  9. [ZJOI2007][BZOJ1059] 矩阵游戏|二分图匹配|匈牙利算法
  10. 再谈new functionName