博客
关于我
solidity之library 用法(二)库的核心用法总结(一个特殊的contract合约)
阅读量:669 次
发布时间:2019-03-15

本文共 2701 字,大约阅读时间需要 9 分钟。

solidity之library的一个核心原则就是:哪个合约调用library,那么library中的this就指向那个合约!

pragma solidity >=0.4.0 <0.6.0;library Test_lib {    // 这里的参数存储位置必须和contract合约调用传参位置一致!    // 官方文档强调:library的内存类型都是通过引用来传递的!    function get_this(string memory names) internal returns(address){        return address(this);    }}contract Test {    // 当前合约调用Test_lib库方法返回的this是指向Test合约的!    function get_this(string memory names) public  returns(address){        // 合约调用library传递参数必须是统一存储位置(引用传值)        // 官方文档强调:library的内存类型都是通过引用来传递的!        return Test_lib.get_this(names);    }}

官方文档对library的一句解释:

库可以看作是使用他们的合约的隐式的基类合约。虽然它们在继承关系中不会显式可见,但调用库函数与调用显式的基类合约十分类似 (如果 L 是库的话,可以使用 L.f() 调用库函数)。此外,就像库是基类合约一样,对所有使用库的合约,库的 internal 函数都是可见的。 当然,需要使用内部调用约定来调用内部函数,这意味着所有内部类型,内存类型都是通过引用而不是复制来传递。

 

最后这句话非常重要:library的内存类型都是通过引用来传递的!

 

用代码来解释这句话,这里要结合contact合约一起来对比解释,否则无法理解!详细可以查看storage、memory和private、internal、public、external之间的关系:

 

library库的memory、storage和private、internal、public、external没任何关系
library既然是contract的特殊合约,为何在内存方面有这么大的区别呢?

原因就在于这句话:library的内存类型都是通过引用来传递的!
也就是说library中的参数是memory还是storage完全取决于调用它的contract对象要传什么值类型(memory或storage)

 

对于contract来说,storage、memory和private、internal、public、external之间的关系:

contract Test {       // private类型函数的函数参数引用类型必须是storage或memory    function ref_private(uint[] memory s) private {        s[0] = 2019;    }    // internal类型函数的函数参数引用类型必须是storage或memory    function ref_internal(uint[] storage s) internal {        s[0] = 2019;    }    // public类型函数的函数参数引用类型只能是memory    function ref_public(uint[] memory s) public {        s[0] = 2019;    }    // external类型函数的函数参数引用类型只能是calldata    function ref_external(uint[] calldata s) external {        //这里无法修改s的值!!!}

对于library来说,storage、memory和private、internal、public、external之间没任何关系

library库的memory、storage和private、internal、public、external没任何关系    library既然是contract的特殊合约,为何在内存方面有这么大的区别呢?    原因就在于这句话:library的内存类型都是通过引用来传递的!    也就是说library中的参数是memory还是storage完全取决于调用它的contract对象要传什么值类型(memory或storage)library Test_Lib {    function test() public {        uint num_parent = 102;    }    // library库的memory、storage和private、internal、public、external没任何关系    function test1(uint[] storage age) public view returns(address) {        return address(this);    }    // library库的memory、storage和private、internal、public、external没任何关系    function test2(uint[] memory age) public view returns(address) {        return address(this);    }    // library库的memory、storage和private、internal、public、external没任何关系    function test3(uint[] storage age) private view returns(address) {        return address(this);    }    // library库的memory、storage和private、internal、public、external没任何关系    function test4(uint[] memory age) private view returns(address) {        return address(this);    }}

 

转载地址:http://msmmz.baihongyu.com/

你可能感兴趣的文章
MySQL数据库性能分析与调优实践
查看>>
mysql数据库扫盲,你真的知道什么是数据库嘛
查看>>
mysql数据库批量插入数据shell脚本实现
查看>>
MySQL数据库操作
查看>>
MySQL数据库故障排错
查看>>
MySQL数据库无法远程连接的解决办法
查看>>
mysql数据库时间类型datetime、bigint、timestamp的查询效率比较
查看>>
MySQL数据库服务器端核心参数详解和推荐配置(一)
查看>>
mysql数据库死锁的产生原因及解决办法
查看>>
MySQL数据库的事务管理
查看>>
mysql数据库的备份与恢复
查看>>
Mysql数据库的条件查询语句
查看>>
MySQL数据库的高可用
查看>>
Mysql数据库相关各种类型的文件
查看>>
MYSQL数据库简单的状态检查(show processlist)
查看>>
MYSQL数据库简单的状态检查(show status)
查看>>
MySQL数据库系列
查看>>
MYSQL数据库自动本地/异地双备份/MYSQL增量备份
查看>>
mysql数据库表增添字段,删除字段、修改字段的排列等操作,还不快来
查看>>
MySQL数据库被黑了
查看>>