成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

智能合約語言Solidity教程系列5 - 數(shù)組介紹

draveness / 3711人閱讀

摘要:還需注意的一點(diǎn)是,定長數(shù)組,不能與變長數(shù)組相互賦值,我們來看下面的代碼無法編譯已經(jīng)計(jì)劃在未來移除這樣的限制。的變長數(shù)組,可以通過給賦值調(diào)整數(shù)組長度。的變長數(shù)組不支持。

本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:智能合約語言Solidity教程系列5 - 數(shù)組介紹原文已更新,請讀者前往原文閱讀

Solidity 教程系列第5篇 - Solidity 數(shù)組介紹。
Solidity 系列完整的文章列表請查看分類-Solidity。

寫在前面

Solidity 是以太坊智能合約編程語言,閱讀本文前,你應(yīng)該對(duì)以太坊、智能合約有所了解,
如果你還不了解,建議你先看以太坊是什么

本文前半部分是參考Solidity官方文檔(當(dāng)前最新版本:0.4.20)進(jìn)行翻譯,后半部分對(duì)官方文檔中沒有提供代碼的知識(shí)點(diǎn)補(bǔ)充代碼說明(訂閱專欄閱讀)。

數(shù)組(Arrays)

數(shù)組可以聲明時(shí)指定長度,也可以是動(dòng)態(tài)變長。對(duì)storage存儲(chǔ)的數(shù)組來說,元素類型可以是任意的,類型可以是數(shù)組,映射類型,結(jié)構(gòu)體等。但對(duì)于memory的數(shù)組來說。如果作為public函數(shù)的參數(shù),它不能是映射類型的數(shù)組,只能是支持ABI的類型。

一個(gè)元素類型為T,固定長度為k的數(shù)組,可以聲明為T[k],而一個(gè)動(dòng)態(tài)大小(變長)的數(shù)組則聲明為T[]。
還可以聲明一個(gè)多維數(shù)組,如聲明一個(gè)類型為uint的數(shù)組長度為5的變長數(shù)組(5個(gè)元素都是變長數(shù)組),可以聲明為uint[][5]。(注意,相比非區(qū)塊鏈語言,多維數(shù)組的長度聲明是反的。)

要訪問第三個(gè)動(dòng)態(tài)數(shù)組的第二個(gè)元素,使用x2。數(shù)組的序號(hào)是從0開始的,序號(hào)順序與定義相反。

bytesstring是一種特殊的數(shù)組。bytes類似byte[],但在外部函數(shù)作為參數(shù)調(diào)用中,bytes會(huì)進(jìn)行壓縮打包。string類似bytes,但不提供長度和按序號(hào)的訪問方式(目前)。
所以應(yīng)該盡量使用bytes而不是byte[]

可以將字符串s通過bytes(s)轉(zhuǎn)為一個(gè)bytes,可以通過bytes(s).length獲取長度,bytes(s)[n]獲取對(duì)應(yīng)的UTF-8編碼。通過下標(biāo)訪問獲取到的不是對(duì)應(yīng)字符,而是UTF-8編碼,比如中文編碼是多字節(jié),變長的,所以下標(biāo)訪問到的只是其中的一個(gè)編碼。
類型為數(shù)組的狀態(tài)變量,可以標(biāo)記為public,從而讓Solidity創(chuàng)建一個(gè)訪問器,如果要訪問數(shù)組的某個(gè)元素,指定數(shù)字下標(biāo)就好了。(稍后代碼事例)
創(chuàng)建內(nèi)存數(shù)組

可使用new關(guān)鍵字創(chuàng)建一個(gè)memory的數(shù)組。與stroage數(shù)組不同的是,你不能通過.length的長度來修改數(shù)組大小屬性。我們來看看下面的例子:

pragma solidity ^0.4.16;

contract C {
    function f(uint len) public pure {
        uint[] memory a = new uint[](7);
                
        //a.length = 100;  // 錯(cuò)誤
        bytes memory b = new bytes(len);
        // Here we have a.length == 7 and b.length == len
        a[6] = 8;
    }
}
數(shù)組常量及內(nèi)聯(lián)數(shù)組

數(shù)組常量,是一個(gè)數(shù)組表達(dá)式(還沒有賦值到變量)。下面是一個(gè)簡單的例子:

pragma solidity ^0.4.16;

contract C {
    function f() public pure {
        g([uint(1), 2, 3]);
    }
    function g(uint[3] _data) public pure {
        // ...
    }
}

通過數(shù)組常量,創(chuàng)建的數(shù)組是memory的,同時(shí)還是定長的。元素類型則是使用剛好能存儲(chǔ)的元素的能用類型,比如[1, 2, 3],只需要uint8即可存儲(chǔ),它的類型是uint8[3] memory

由于g()方法的參數(shù)需要的是uint(默認(rèn)的uint表示的其實(shí)是uint256),所以需要對(duì)第一個(gè)元素進(jìn)行類型轉(zhuǎn)換,使用uint(1)來進(jìn)行這個(gè)轉(zhuǎn)換。

還需注意的一點(diǎn)是,定長數(shù)組,不能與變長數(shù)組相互賦值,我們來看下面的代碼:

//  無法編譯
pragma solidity ^0.4.0;

contract C {
    function f() public {
        // The next line creates a type error because uint[3] memory
        // cannot be converted to uint[] memory.
        uint[] x = [uint(1), 3, 4];
    }
}

已經(jīng)計(jì)劃在未來移除這樣的限制。當(dāng)前因?yàn)锳BI傳遞數(shù)組還有些問題。

成員 length屬性

數(shù)組有一個(gè).length屬性,表示當(dāng)前的數(shù)組長度。storage的變長數(shù)組,可以通過給.length賦值調(diào)整數(shù)組長度。memory的變長數(shù)組不支持。
不能通過訪問超出當(dāng)前數(shù)組的長度的方式,來自動(dòng)實(shí)現(xiàn)改變數(shù)組長度。memory數(shù)組雖然可以通過參數(shù),靈活指定大小,但一旦創(chuàng)建,大小不可調(diào)整。

push方法

storage的變長數(shù)組和bytes都有一個(gè)push方法(string沒有),用于附加新元素到數(shù)據(jù)末端,返回值為新的長度。

限制情況

當(dāng)前在external函數(shù)中,不能使用多維數(shù)組。

另外,基于EVM的限制,不能通過外部函數(shù)返回動(dòng)態(tài)的內(nèi)容。

contract C {
     function f() returns (uint[]) { ... }
      }

在這個(gè)的例子中,如果通過web.js調(diào)用能返回?cái)?shù)據(jù),但從Solidity中調(diào)用不能返回?cái)?shù)據(jù)。一種繞過這個(gè)問題的辦法是使用一個(gè)非常大的靜態(tài)數(shù)組。

pragma solidity ^0.4.16;

contract ArrayContract {
    uint[2**20] m_aLotOfIntegers;
    // 這里不是兩個(gè)動(dòng)態(tài)數(shù)組的數(shù)組,而是一個(gè)動(dòng)態(tài)數(shù)組里,每個(gè)元素是長度為二的數(shù)組。
    bool[2][] m_pairsOfFlags;
    // newPairs 存在 memory里,因?yàn)槭呛瘮?shù)參數(shù)
    function setAllFlagPairs(bool[2][] newPairs) public {
        m_pairsOfFlags = newPairs;
    }

    function setFlagPair(uint index, bool flagA, bool flagB) public {
        // 訪問不存在的index會(huì)拋出異常
        m_pairsOfFlags[index][0] = flagA;
        m_pairsOfFlags[index][1] = flagB;
    }

    function changeFlagArraySize(uint newSize) public {
        // 如果新size更小, 移除的元素會(huì)被銷毀
        m_pairsOfFlags.length = newSize;
    }

    function clear() public {
        // 銷毀
        delete m_pairsOfFlags;
        delete m_aLotOfIntegers;
        // 同銷毀一樣的效果
        m_pairsOfFlags.length = 0;
    }

    bytes m_byteData;

    function byteArrays(bytes data) public {
        // byte arrays ("bytes") are different as they are stored without padding,
        // but can be treated identical to "uint8[]"
        m_byteData = data;
        m_byteData.length += 7;
        m_byteData[3] = byte(8);
        delete m_byteData[2];
    }

    function addFlag(bool[2] flag) public returns (uint) {
        return m_pairsOfFlags.push(flag);
    }

    function createMemoryArray(uint size) public pure returns (bytes) {
        // Dynamic memory arrays are created using `new`:
        uint[2][] memory arrayOfPairs = new uint[2][](size);
        // Create a dynamic byte array:
        bytes memory b = new bytes(200);
        for (uint i = 0; i < b.length; i++)
            b[i] = byte(i);
        return b;
    }
}
補(bǔ)充事例說明

事例代碼及講解,請訂閱區(qū)塊鏈技術(shù)查看。

參考視頻

我們也推出了目前市面上最全的視頻教程:深入詳解以太坊智能合約語言Solidity
目前我們也在招募體驗(yàn)師,可以點(diǎn)擊鏈接了解。

參考文檔

Solidity官方文檔-數(shù)組

? 深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。

? 我的知識(shí)星球為各位解答區(qū)塊鏈技術(shù)問題,歡迎加入討論。

? 關(guān)注公眾號(hào)“深入淺出區(qū)塊鏈技術(shù)”第一時(shí)間獲取區(qū)塊鏈技術(shù)信息。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24091.html

相關(guān)文章

  • 智能合約語言Solidity教程系列1 - 類型介紹

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列地址類型介紹原文已更新,請讀者前往原文閱讀現(xiàn)在的中文文檔,要么翻譯的太爛,要么太舊,決定重新翻譯下。枚舉類型應(yīng)至少有一名成員。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列2 - 地址類型介紹原文已更新,請讀者前往原文閱讀 現(xiàn)在的Solidity中文文檔,要么翻譯的太爛,要么太舊,決定重新翻譯下。...

    andycall 評(píng)論0 收藏0
  • 智能合約語言 Solidity 教程系列9 - 錯(cuò)誤處理

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列錯(cuò)誤處理原文已更新,請讀者前往原文閱讀這是教程系列文章第篇介紹錯(cuò)誤處理。如果合約沒有修飾符的的函數(shù)在接收以太幣時(shí)包括構(gòu)造函數(shù),和回退函數(shù)。如果合約通過一個(gè)的函數(shù)接收以太幣。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列9 - 錯(cuò)誤處理原文已更新,請讀者前往原文閱讀 這是Solidity教程系列文章...

    xialong 評(píng)論0 收藏0
  • 區(qū)塊鏈技術(shù)學(xué)習(xí)指引

    摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

    Cristic 評(píng)論0 收藏0
  • 智能合約語言 Solidity 教程系列4 - 數(shù)據(jù)存儲(chǔ)位置分析

    摘要:狀態(tài)變量合約內(nèi)聲明的公有變量還有一個(gè)存儲(chǔ)位置是,用來存儲(chǔ)函數(shù)參數(shù),是只讀的,不會(huì)永久存儲(chǔ)的一個(gè)數(shù)據(jù)位置。稱這個(gè)為狀態(tài)改變,這也是合約級(jí)變量稱為狀態(tài)變量的原因。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列4 - 數(shù)據(jù)存儲(chǔ)位置分析原文已更新,請讀者前往原文閱讀 Solidity教程系列第4篇 - Solidity數(shù)據(jù)位置分析。 寫在前面 Solidity...

    Galence 評(píng)論0 收藏0
  • 智能合約語言 Solidity 教程系列6 - 結(jié)構(gòu)體與映射

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列結(jié)構(gòu)體與映射原文已更新,請讀者前往原文閱讀教程系列第篇結(jié)構(gòu)體與映射。不能聲明一個(gè)同時(shí)將自身作為成員,這個(gè)限制是基于結(jié)構(gòu)體的大小必須是有限的。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言Solidity教程系列6 - 結(jié)構(gòu)體與映射原文已更新,請讀者前往原文閱讀 Solidity 教程系列第6篇 - Solidity 結(jié)構(gòu)體與...

    masturbator 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<