玩以太坊链上项目的必备技能(库 [library]-Solidity之旅十七)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
库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.0
pragma 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.0
pragma 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);
。
注意库函数的第一个参数成为函数被调用的对象。其余的和后续的参数仍然在函数调用中。
今天恰逢平安夜
正在浏览这篇文章屏幕前的您苹果吃了吗无论如何我还是衷心地祝福您、以及您的家人身体健康出入平安。听说祝福别人的人一生都会平安安然地度过余生当然咯这或许是圣诞老人给我们特别的祝福吧