Solidity 學(xué)習(xí) -練氣期(八)

函數(shù)重載

定義兩個(gè)函數(shù)不同的是參數(shù)不同。再經(jīng)過(guò)編譯器編譯后,編程了不同的選擇器(selector)

    function saySomething() public pure returns(string memory){
        return("Nothing");
    }

    function saySomething(string memory something) public pure returns(string memory) {
        return something;
    }

實(shí)參匹配
注意??:如下的情況會(huì)報(bào)錯(cuò),因?yàn)?0既能轉(zhuǎn)成uint8,也能轉(zhuǎn)成uint256,編譯器不能確定調(diào)用那個(gè)重載版本

    function f(uint8 _in). public pure returns(uint8 out) {
        out = _in;
    }

    function f(uint256 _in). public pure returns(uint256 out) {
        out = _in;
    }

庫(kù)合約

一種特殊的合約,目的提升Solidity代碼重用性,以及減少合約運(yùn)行的gas消耗。
庫(kù)合約和普通合約有幾個(gè)不同點(diǎn):
(1)庫(kù)合約不能存在狀態(tài)變量。
(2)庫(kù)合約不能繼承別的合約,也不能被繼承。
(3)庫(kù)合約不能接受ETH
(4)庫(kù)合約不能被銷毀
簡(jiǎn)單了解一個(gè)區(qū)塊鏈應(yīng)用程序標(biāo)準(zhǔn)化組織OpenZeppelin 為solidity合約開(kāi)發(fā)的方便性和安全性開(kāi)發(fā)了一些列庫(kù)合約。關(guān)鍵字library
一個(gè)例子:實(shí)現(xiàn)一個(gè)簡(jiǎn)單版本Strings庫(kù)合約:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

library Strings{
    bytes16 private constant _HEX_SYMBOLS = "0123456abcdef";

    /**
     * 將一個(gè)uint256 轉(zhuǎn)換為十進(jìn)制類型表示的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);
    }
    /**
     * 將一個(gè)uint256 轉(zhuǎn)換為16進(jìn)制類型表示的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);
    }    
    /**
     * 將一個(gè)uint256 轉(zhuǎn)換為16進(jìn)制類型表示定長(zhǎng)的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);

    }
}

使用庫(kù)合約的方法

  1. 使用using for 指令:using A for B
    A 是庫(kù)合約名稱,B 時(shí)Solidity中的數(shù)據(jù)類型名稱。作用將庫(kù)合約A中的函數(shù)自動(dòng)添加為B類型的成員函數(shù),可以直接調(diào)用。
    注意??:以變量成員函數(shù)調(diào)用庫(kù)合約的中的函數(shù)時(shí),變量本身會(huì)被當(dāng)作函數(shù)的第一個(gè)參數(shù)傳遞。因此書寫的參數(shù)少一個(gè)
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. 通過(guò)庫(kù)合約名稱調(diào)用庫(kù)函數(shù)
    類似其他編程語(yǔ)言的“靜態(tài)方法”或者“類方法”

導(dǎo)入其他合約。import 關(guān)鍵字

  1. 導(dǎo)入文件位置
    import './Yeye.sol'
    通過(guò)源文件網(wǎng)址導(dǎo)入網(wǎng)上的合約的全局符號(hào)
    通過(guò)npm 包管理器的目錄導(dǎo)入


    image.png
  2. 導(dǎo)入一個(gè)或多個(gè)指定的符號(hào)
    import {Yeye} from '../Yeye.sol'

前面有涉及不再舉例子

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容