博客
关于我
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 常见ALTER TABLE操作
查看>>
MySQL 常见的 9 种优化方法
查看>>
MySQL 常见的开放性问题
查看>>
Mysql 常见错误
查看>>
mysql 常见问题
查看>>
MYSQL 幻读(Phantom Problem)不可重复读
查看>>
mysql 往字段后面加字符串
查看>>
mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
查看>>
MySQL 快速创建千万级测试数据
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
MySql 手动执行主从备份
查看>>
Mysql 批量修改四种方式效率对比(一)
查看>>
mysql 批量插入
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>