本文共 2701 字,大约阅读时间需要 9 分钟。
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); }}
L
是库的话,可以使用 L.f()
调用库函数)。此外,就像库是基类合约一样,对所有使用库的合约,库的 internal
函数都是可见的。 当然,需要使用内部调用约定来调用内部函数,这意味着所有内部类型,内存类型都是通过引用而不是复制来传递。
用代码来解释这句话,这里要结合contact合约一起来对比解释,否则无法理解!详细可以查看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库的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/