Solidity 学习 -练气期(八)

函数重载

定义两个函数不同的是参数不同。再经过编译器编译后,编程了不同的选择器(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);

    }
}

使用库合约的方法

  1. 使用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();
    }
}
  1. 通过库合约名称调用库函数
    类似其他编程语言的“静态方法”或者“类方法”

导入其他合约。import 关键字

  1. 导入文件位置
    import './Yeye.sol'
    通过源文件网址导入网上的合约的全局符号
    通过npm 包管理器的目录导入


    image.png
  2. 导入一个或多个指定的符号
    import {Yeye} from '../Yeye.sol'

前面有涉及不再举例子

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容