時(shí)間:2023-06-17|瀏覽:240
1. 創(chuàng)建數(shù)組 1.1 字面量 我們可以使用字面量創(chuàng)建數(shù)組并隱式創(chuàng)建一個(gè)定長(zhǎng)數(shù)組: ``` uint[3] memory a = [1,2,3]; ``` 需要注意的是,數(shù)組元素類(lèi)型應(yīng)該剛好能存儲(chǔ)的元素類(lèi)型。例如,[1,2,3]只需要uint8即可存儲(chǔ)。但由于我們聲明的變量是uint(默認(rèn)的uint表示的是uint256),所以需要使用uint(1)進(jìn)行顯式的類(lèi)型轉(zhuǎn)換。而字面量方式聲明的數(shù)組是定長(zhǎng)的,實(shí)際長(zhǎng)度必須與聲明相匹配,否則編譯器會(huì)報(bào)錯(cuò)。例如:Type string memory[1] memory is not implicitly convertible to expected type string memory[2] memory。
1.2 new關(guān)鍵字 對(duì)于變長(zhǎng)數(shù)組,需要使用new關(guān)鍵字來(lái)初始化一個(gè)數(shù)組。例如: ``` uint[] memory a; a = new uint[](2); ``` 在聲明前使用下標(biāo)方式訪(fǎng)問(wèn)將會(huì)報(bào)錯(cuò),但我們可以使用new uint[](2)進(jìn)行初始化。
2. 數(shù)據(jù)屬性和方法 2.1 length屬性 數(shù)組有一個(gè)length屬性,表示當(dāng)前數(shù)組長(zhǎng)度??梢酝ㄟ^(guò)給length賦值調(diào)整數(shù)組長(zhǎng)度。對(duì)于storage的變長(zhǎng)數(shù)組,可以進(jìn)行長(zhǎng)度調(diào)整。例如: ``` uint[] storage a; a.length++; ``` 或者使用push方法來(lái)隱式擴(kuò)展數(shù)組長(zhǎng)度。
對(duì)于memory的變長(zhǎng)數(shù)組,雖然可以通過(guò)參數(shù)靈活指定大小,但一旦創(chuàng)建,大小不可調(diào)整。
2.2 push方法 變長(zhǎng)的storage數(shù)組和bytes(不包括string)有一個(gè)push方法。可以將一個(gè)新元素附加到數(shù)組末端,返回值為當(dāng)前長(zhǎng)度。例如: ``` uint[] storage a; a.push(1); ``` 同時(shí)需要注意的是memory的變長(zhǎng)數(shù)組不支持push。
2.3 下標(biāo) 數(shù)組可以通過(guò)數(shù)字下標(biāo)訪(fǎng)問(wèn),從0開(kāi)始。對(duì)于大小為2的數(shù)組T[2],要訪(fǎng)問(wèn)第二個(gè)元素,要使用下標(biāo)值1。
如果狀態(tài)變量類(lèi)型為數(shù)組,也可以標(biāo)記為public類(lèi)型,從而讓Solidity創(chuàng)建一個(gè)訪(fǎng)問(wèn)器。例如: ``` uint[] public a; ``` 訪(fǎng)問(wèn)具體的元素時(shí)需要輸入一個(gè)要訪(fǎng)問(wèn)序號(hào)的數(shù)字。
3. 多維數(shù)組 和大多數(shù)程序語(yǔ)言一樣,多維數(shù)據(jù)的定義也很類(lèi)似。例如,我們要?jiǎng)?chuàng)建一個(gè)長(zhǎng)度為5的uint數(shù)組,每個(gè)元素又是一個(gè)變長(zhǎng)數(shù)組。將被聲明為uint[][5](需要注意的是,與其它語(yǔ)言不同的是,需要反過(guò)來(lái)定義)。
例如,聲明一個(gè)二維數(shù)組,它是一個(gè)變長(zhǎng)的數(shù)組,里面的每個(gè)元素是一個(gè)長(zhǎng)度為2的數(shù)組。要訪(fǎng)問(wèn)這個(gè)數(shù)組flags,第一個(gè)下標(biāo)為變長(zhǎng)數(shù)組的序號(hào),第二個(gè)下標(biāo)為長(zhǎng)度為2的數(shù)組序號(hào): ``` uint[][] flags; uint[] storage f = flags[0]; f.push(1); ```
4. bytes和string bytes和string是一種特殊的數(shù)組。bytes類(lèi)似byte[],但不同的是,在外部函數(shù)會(huì)進(jìn)行壓縮打包,更省空間,所以應(yīng)該盡量使用bytes[1]。string類(lèi)似bytes,但不提供長(zhǎng)度和按序號(hào)的訪(fǎng)問(wèn)方式。
由于bytes和string是可以自由轉(zhuǎn)換的,可以將字符串s通過(guò)bytes(s)轉(zhuǎn)為一個(gè)bytes。需要注意的是,通過(guò)這種方式訪(fǎng)問(wèn)到的是UTF-8編碼的碼流,并不是獨(dú)立的一個(gè)個(gè)字符。比如,中文編碼是多字節(jié)、變長(zhǎng)的,所以你訪(fǎng)問(wèn)到的很有可能只是其中的一個(gè)代碼點(diǎn)。另外,bytes支持push方法。
5. 限制 在外部函數(shù)中,目前還不能使用多維數(shù)組。因?yàn)镋VM的限制,外部函數(shù)不能返回變長(zhǎng)數(shù)據(jù)??梢允褂靡粋€(gè)非常大的定長(zhǎng)數(shù)組作為解決辦法。
以上就是Solidity數(shù)組的內(nèi)容,希望對(duì)大家有所幫助,
作者專(zhuān)注于以太坊(Ethereum)和Solidity技術(shù)的研究,更多信息請(qǐng)見(jiàn)作者的個(gè)人博客。
熱點(diǎn):數(shù)據(jù)