這篇文章主要講解了“Solidit數(shù)組有什么用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Solidit數(shù)組有什么用”吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、永勝網(wǎng)站維護(hù)、網(wǎng)站推廣。
數(shù)組可以聲明時(shí)指定長(zhǎng)度,也可以是動(dòng)態(tài)變長(zhǎng)。對(duì)storage存儲(chǔ)的數(shù)組來(lái)說(shuō),元素類型可以是任意的,類型可以是數(shù)組,映射類型,結(jié)構(gòu)體等。但對(duì)于memory的數(shù)組來(lái)說(shuō)。如果作為public函數(shù)的參數(shù),它不能是映射類型的數(shù)組,只能是支持ABI的類型。
一個(gè)元素類型為T,固定長(zhǎng)度為k的數(shù)組,可以聲明為T[k],而一個(gè)動(dòng)態(tài)大?。ㄗ冮L(zhǎng))的數(shù)組則聲明為T[]。 還可以聲明一個(gè)多維數(shù)組,如聲明一個(gè)類型為uint的數(shù)組長(zhǎng)度為5的變長(zhǎng)數(shù)組(5個(gè)元素都是變長(zhǎng)數(shù)組),可以聲明為uint[][5]。(注意,相比非區(qū)塊鏈語(yǔ)言,多維數(shù)組的長(zhǎng)度聲明是反的。)
要訪問(wèn)第三個(gè)動(dòng)態(tài)數(shù)組的第二個(gè)元素,使用x[2][1]。數(shù)組的序號(hào)是從0開始的,序號(hào)順序與定義相反。
bytes和string是一種特殊的數(shù)組。bytes類似byte[],但在外部函數(shù)作為參數(shù)調(diào)用中,bytes會(huì)進(jìn)行壓縮打包。string類似bytes,但不提供長(zhǎng)度和按序號(hào)的訪問(wèn)方式(目前)。 所以應(yīng)該盡量使用bytes而不是byte[]。
可以將字符串s通過(guò)bytes(s)轉(zhuǎn)為一個(gè)bytes,可以通過(guò)bytes(s).length獲取長(zhǎng)度,bytes(s)[n]獲取對(duì)應(yīng)的UTF-8編碼。通過(guò)下標(biāo)訪問(wèn)獲取到的不是對(duì)應(yīng)字符,而是UTF-8編碼,比如中文編碼是多字節(jié),變長(zhǎng)的,所以下標(biāo)訪問(wèn)到的只是其中的一個(gè)編碼。 類型為數(shù)組的狀態(tài)變量,可以標(biāo)記為public,從而讓Solidity創(chuàng)建一個(gè)訪問(wèn)器,如果要訪問(wèn)數(shù)組的某個(gè)元素,指定數(shù)字下標(biāo)就好了。(稍后代碼事例)
可使用new關(guān)鍵字創(chuàng)建一個(gè)memory的數(shù)組。與stroage數(shù)組不同的是,你不能通過(guò).length的長(zhǎng)度來(lái)修改數(shù)組大小屬性。我們來(lái)看看下面的例子:
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ù)組常量,是一個(gè)數(shù)組表達(dá)式(還沒(méi)有賦值到變量)。下面是一個(gè)簡(jiǎn)單的例子:
pragma solidity ^0.4.16; contract C { function f() public pure { g([uint(1), 2, 3]); } function g(uint[3] _data) public pure { // ... } }
通過(guò)數(shù)組常量,創(chuàng)建的數(shù)組是memory的,同時(shí)還是定長(zhǎng)的。元素類型則是使用剛好能存儲(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)來(lái)進(jìn)行這個(gè)轉(zhuǎn)換。
還需注意的一點(diǎn)是,定長(zhǎng)數(shù)組,不能與變長(zhǎng)數(shù)組相互賦值,我們來(lái)看下面的代碼:
// 無(wú)法編譯 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ì)劃在未來(lái)移除這樣的限制。當(dāng)前因?yàn)锳BI傳遞數(shù)組還有些問(wèn)題。
數(shù)組有一個(gè).length屬性,表示當(dāng)前的數(shù)組長(zhǎng)度。storage的變長(zhǎng)數(shù)組,可以通過(guò)給.length賦值調(diào)整數(shù)組長(zhǎng)度。memory的變長(zhǎng)數(shù)組不支持。 不能通過(guò)訪問(wèn)超出當(dāng)前數(shù)組的長(zhǎng)度的方式,來(lái)自動(dòng)實(shí)現(xiàn)改變數(shù)組長(zhǎng)度。memory數(shù)組雖然可以通過(guò)參數(shù),靈活指定大小,但一旦創(chuàng)建,大小不可調(diào)整。
storage的變長(zhǎng)數(shù)組和bytes都有一個(gè)push方法(string沒(méi)有),用于附加新元素到數(shù)據(jù)末端,返回值為新的長(zhǎng)度。
當(dāng)前在external函數(shù)中,不能使用多維數(shù)組。
另外,基于EVM的限制,不能通過(guò)外部函數(shù)返回動(dòng)態(tài)的內(nèi)容。
contract C { function f() returns (uint[]) { ... } }
在這個(gè)的例子中,如果通過(guò)web.js調(diào)用能返回?cái)?shù)據(jù),但從Solidity中調(diào)用不能返回?cái)?shù)據(jù)。一種繞過(guò)這個(gè)問(wèn)題的辦法是使用一個(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è)元素是長(zhǎng)度為二的數(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 { // 訪問(wèn)不存在的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; } }
感謝各位的閱讀,以上就是“Solidit數(shù)組有什么用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Solidit數(shù)組有什么用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
網(wǎng)站題目:Solidit數(shù)組有什么用
網(wǎng)頁(yè)地址:http://jinyejixie.com/article38/iehcpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、移動(dòng)網(wǎng)站建設(shè)、App開發(fā)、微信公眾號(hào)、軟件開發(fā)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)