博客
关于我
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
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
查看>>
MySQL 错误
查看>>
mysql 随机数 rand使用
查看>>
MySQL 面试题汇总
查看>>
MySQL 面试,必须掌握的 8 大核心点
查看>>
MySQL 高可用性之keepalived+mysql双主
查看>>
MySQL 高性能优化规范建议
查看>>
mysql 默认事务隔离级别下锁分析
查看>>
Mysql--逻辑架构
查看>>
MySql-2019-4-21-复习
查看>>
mysql-5.6.17-win32免安装版配置
查看>>
mysql-5.7.18安装
查看>>
MySQL-Buffer的应用
查看>>
mysql-cluster 安装篇(1)---简介
查看>>
mysql-connector-java.jar乱码,最新版mysql-connector-java-8.0.15.jar,如何愉快的进行JDBC操作...
查看>>
mysql-connector-java各种版本下载地址
查看>>
mysql-EXPLAIN
查看>>