写点什么

Solidity 之旅十七 - 库 [library]

作者:BSN研习社
  • 2024-01-05
    浙江
  • 本文字数:1205 字

    阅读完需:约 4 分钟

Solidity之旅十七-库 [library]

库(library)

作为开发者的您,想必对项目中重复使用的工具函数,抽取到一个公共中,以便可以在您项目中的其它位置可调用。而 Solidity 与您所熟知的没有什么不同,它也是用来实现可重复调用,且还能省 gas fee。闲话少叙,切入正题。让我们来看看 Solidity library 吧!


虽然 Solidity 中的 library 看起来和合约(contract)有些类似,但它并不是一个合约,它包含了可能多个消费者合约共有的功能,这有助于避免冗余。


来看看 Solidity 对 library 的约束:


1、无状态


Solidity 中的库是一个无状态实体。它本质上意味着,与合约不同,您不能在一个库中定义状态变量。更简单地说,库函数不允许改变或修改合约的状态。


2、仅供查看的函数


调用库函数不会消耗 gas,因为它不会修改合约的状态。换句话说,一个库只能实现 pure 函数或 view 函数。


3、内部函数


一个库不能从外部范围调用。其他合约显然可以调用它们,但它们不能从部署的外部访问。


4、不能继承


因为库是一个独立的实体,它不能继承任何其他的库或合约。一个库不能被任何其他实体/库/合同继承。


5、没有回退或支付功能


一个库不能实现回退或支付功能。


(将来有可能会解除这些限制)


如何创建 library(库)


在了解了关于库的一些概念后,让我们来创建一个 library。


想要在 Solidity 创建库,需使用 library 关键字。


//SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.0;
library MyLibrary { function add(uint a, uint b) public pure returns(uint) { return a + b; }
复制代码


using … for … 使用库

// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.0;
import "./library_example.sol"; //导入库
contract UseLibraryExample { using MyLibrary for uint;
function getSum(uint firstNumber, uint secondNumber) public pure returns(uint) { return firstNumber.add(secondNumber); //您对这句可能产生了困惑 } }
复制代码


为了在合约中使用任何库,我们需要首先告诉合约该库可以操作哪种数据类型。我们通过在合同中加入使用来操作;行来实现。


例如,library MyLibrary 中的函数 add 对 uint 进行操作,因为它把 uint a 作为它的第一个参数。


为了便于理解,您可以简单地,假设您的库函数成为 uint 数据类型本身的一部分,并在其对象中随时可用。


最后,当库函数成为数据类型本身的一部分时,我们可以在其对象上调用该方法,如我们上面的契约所示,即 firstNumber.add(secondNumber); 。


注意,库函数的第一个参数成为函数被调用的对象。其余的和后续的参数仍然在函数调用中。

版权声明:本文为 CSDN 博主「甄齐才」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/coco2d_x2014/article/details/128431596


文章来源:CSDN 博主「甄齐才」

文章原标题:《玩以太坊链上项目的必备技能(库 [library]-Solidity 之旅十七)》

旨在传播区块链相关技术,如有侵权请与我们联系删除。

用户头像

BSN研习社

关注

还未添加个人签名 2021-11-05 加入

还未添加个人简介

评论

发布
暂无评论
Solidity之旅十七-库 [library]_BSN研习社_InfoQ写作社区