函数重载
定义两个函数不同的是参数不同。再经过编译器编译后,编程了不同的选择器(selector)
function saySomething() public pure returns(string memory){
return("Nothing");
}
function saySomething(string memory something) public pure returns(string memory) {
return something;
}
实参匹配
注意⚠️:如下的情况会报错,因为50既能转成uint8,也能转成uint256,编译器不能确定调用那个重载版本
function f(uint8 _in). public pure returns(uint8 out) {
out = _in;
}
function f(uint256 _in). public pure returns(uint256 out) {
out = _in;
}
库合约
一种特殊的合约,目的提升Solidity代码重用性,以及减少合约运行的gas消耗。
库合约和普通合约有几个不同点:
(1)库合约不能存在状态变量。
(2)库合约不能继承别的合约,也不能被继承。
(3)库合约不能接受ETH
(4)库合约不能被销毁
简单了解一个区块链应用程序标准化组织OpenZeppelin 为solidity合约开发的方便性和安全性开发了一些列库合约。关键字library
一个例子:实现一个简单版本Strings库合约:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
library Strings{
bytes16 private constant _HEX_SYMBOLS = "0123456abcdef";
/**
* 将一个uint256 转换为十进制类型表示的ASCII字符串
*/
function toString(uint256 value) public pure returns(string memory) {
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* 将一个uint256 转换为16进制类型表示的ASCII字符串
*/
function toHexString(uint256 value) public pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length ++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* 将一个uint256 转换为16进制类型表示定长的ASCII字符串
*/
function toHexString(uint256 value, uint256 length)
public pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0,"Strings:hex length insuficient");
return string(buffer);
}
}
使用库合约的方法
- 使用using for 指令:using A for B
A 是库合约名称,B 时Solidity中的数据类型名称。作用将库合约A中的函数自动添加为B类型的成员函数,可以直接调用。
注意⚠️:以变量成员函数调用库合约的中的函数时,变量本身会被当作函数的第一个参数传递。因此书写的参数少一个
pragma solidity ^0.8.30;
import "./demo_lib.sol";
contract uselib {
using Strings for uint256;
function getString1(uint256 _number) public pure returns(string memory){
return _number.toHexString();
}
}
- 通过库合约名称调用库函数
类似其他编程语言的“静态方法”或者“类方法”
导入其他合约。import 关键字
-
导入文件位置
import './Yeye.sol'
通过源文件网址导入网上的合约的全局符号
通过npm 包管理器的目录导入
image.png 导入一个或多个指定的符号
import {Yeye} from '../Yeye.sol'
前面有涉及不再举例子
