博客
关于我
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 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>