博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
solidity之library 用法(二)库的核心用法总结(一个特殊的contract合约)
阅读量:666 次
发布时间: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/

你可能感兴趣的文章