Solidity基础入门知识---函数的访问权限和可见性
想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】
链客,有问必答!!
下面来继续介绍作为一个分布式网络语言所特有的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基础入门知识---函数的访问权限和可见性相关推荐
- Solidity基础入门知识(十)函数的访问权限和可见性
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及So ...
- Solidity基础入门知识(八)结构体structs
自定义结构体 pragma solidity ^0.4.4;contract Students {struct Person {uint age;uint stuID;string name;}} P ...
- Python基础入门知识(2)
接前面的文章: Python基础入门知识(1) Python基础入门教学 2 Python的基础知识 2.2 数据类型 2.2.2 数值类型 2.2.2.1 整数 2.2.2.2 浮点数 2.2.2. ...
- Swift基础入门知识学习(12)-枚举(列举)-讲给你懂
TED演讲的8个秘诀:学习18分钟高效表达-重点笔记 Swift基础入门知识学习(11-2)-閉包-第二篇-讲给你懂 目录 枚举(列举)语法 使用 Switch 语句匹配枚举(列举)值 相关值 原始值 ...
- 自己总结的MySQL基础入门知识,附思维导图
第一次写博文,问题点可能比较多,辛苦大家帮忙指正,感谢大家. MySQL基础入门知识 前言 一.数据库基础知识 1.什么是数据库 2.数据库的分类 3.数据库的常用语言 4.数据库的常用操作方式 5. ...
- 学python需要什么基础知识-学习Python需要知道哪些基础入门知识?
众所周知,Python以优雅.简洁著称,入行门槛低,可以从事Linux运维.Python Web网站工程师.Python自动化测试.数据分析.人工智能等职位!就目前来看,Python就业前景广阔.很多 ...
- 数据结构基础入门知识
数据结构基础入门知识 ------ 数据结构:理解和练习 <异类-不一样的成功启示录> IP/26 192 IP/25 128 IP/24 192. 128 64 32 16 2 1 ...
- ps基础入门知识课程教程学习文字设计制作小白
ps基础入门知识课程教程学习文字设计制作小白
- 超完整 Python基础入门知识教程
本书旨在帮助Python开发人员发现该语言和相关库的突出特性,并编写简单.流畅.易于阅读和易于维护的代码.特别是生成器.属性描述符(ORM的键)和Python表达式的对象在数据库处理过程中的具体应用: ...
- Swift基础入门知识学习(7)-字典-讲给你懂
Swift基础入门知识学习(6)-数组(阵列)-讲给你懂 目录 声明字典 创建一个空字典 存取与修改字典 使用for-in遍历字典中的所有值 字典转换为数组 Swift字典(dictionary) 用 ...
最新文章
- 微软,您的.net为中国程序员带来了什么?
- 延迟加载算法微服务的模型
- Sublime Text 2 中文包
- php new static,PHP面向对象中new self( )和 new static( ) 的区别
- unity3d collider自动调整大小_自动网格组合建模工具Unity游戏素材资源
- 大屏做成这样,领导不重用你都难
- Oracle SQL存储过程结构、异常处理示例
- 【CF 应用开发大赛】智能静音android应用
- 大前端主题添加强力推荐和联系我们模块
- 华为网关服务器型号,02311CWM CN21ITGC SP212 I350-T4 华为服务器四口千兆网卡
- android 跨应用服务,跨应用启动Service,出现空指针
- 出差中,推荐几个百度,腾讯,抖音大佬的公众号
- (八)Grahpics之Blit
- 模型的评估指标(一)
- STM32的硬件I2C与AT24C16
- STM32F411 Discovery学习笔记(四)串口
- 亥姆霍兹线圈定义与应用
- Android Activity的隐式调用(跨进程)★
- ESIM模型详解与Keras代码实现
- Unity AssetBundle打包
热门文章
- zstuoj 4245 KI的斐波那契
- 【转】Javabyte[]数组和十六进制String之间的转换Util------包含案例和代码
- 程序员求职之道(《程序员面试笔试宝典》)之民间的企业排名的可信度到底有多大?...
- CentOS 7 常用命令
- HDU 1102 Constructing Roads
- Unix命令行程序和内建指令
- 博客“评论王”评选活动开始啦!
- .Net Core[译文]
- [ZJOI2007][BZOJ1059] 矩阵游戏|二分图匹配|匈牙利算法
- 再谈new functionName