六、数组及其操作《2022 solidity8.+ 版本教程到实战》

举报
1_bit 发表于 2022/09/25 04:01:14 2022/09/25
【摘要】 一、数组 在 solidity 中,数组分为定长数组和动态数据,这两者的定义上跟 golang 很相似;其定长数组在创建好后不能设置超过数组长度的值,也就是不能push;而动态数组允许 push,还有一...

一、数组

在 solidity 中,数组分为定长数组和动态数据,这两者的定义上跟 golang 很相似;其定长数组在创建好后不能设置超过数组长度的值,也就是不能push;而动态数组允许 push,还有一点很有意思的是,在删除数组某个元素后,删除的数组中的某个位置的值是还原成了当前类型数组的类型默认值。

1.创建数组

定长数组

定长数组创建很简单,只需要在表示数组的 [] 符号中编写对应的长度即可:

uint[3] public number2=[1,2,3];

  
 
  • 1

动态数组

动态数组和定长数组的定义区别则是不需要在 [] 中编写固定长度,跟 go 很像:

uint[] public number=[1,2,3];

  
 
  • 1

2.数组操作

在 solidity 中就可以对数组进行增删改,改数据不必多说,直接索引后进行值的更改就好,接下来咱们来看在数组中的增删。

增数据

既然定长数组不能够增加长度,那么就说明我们加数组内容需要使用的对象是动态数组,动态数组使用增加数据的方式很简单,直接使用 push 某值即可,代码是:

number.push(val);

  
 
  • 1

删数据

在数组中删除某个值可以使用 delete方法,例如:

delete number[1];

  
 
  • 1

还有一个方法是 pop:

number.pop();

  
 
  • 1

由于使用 delete 方式删除值只是使数组中的某个位置的值归为这个类型的原始值,并不能修改其长度,所以 delete 方法一般用于删除定长数组的值;而 pop 方法将会删除这个数组中最后一个元素值,并且使其长度发生改变,所以可用于动态数组之中。

3.数组在函数中进行创建

创建数组时,若在与方法同级,那么则直接创建数组即可,若在函数之中,需要指定当前数据的位置,例如以下一个方法:

function createArray()external pure{
    uint[] memory ages = new uint[](3);
}

  
 
  • 1
  • 2
  • 3

以上方法创建了一个 uint 类型的定长数组,使用 memory 指定为内存级别的变量,长度为3。

二、数组删除某值的方式

在此我们创建一个合约名为 ArrayDemo:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.6;
contract ArrayDemo{
}

  
 
  • 1
  • 2
  • 3
  • 4

在合约中创建两个数组,一个定长一个动态:

uint[] public number=[1,2,3];
uint[3] public number2=[1,2,3];

  
 
  • 1
  • 2

接着创建几个操作数组的方法:

function push(uint val)external{
    number.push(val);
}
function pop()external{
    number.pop();
}

function deleteVal()external{
    delete number[number.length-1];
}

function createArray()external pure{
    uint[] memory ages = new uint[](3);
}

function getArray()external view returns(uint[] memory){
    return number;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

以上最后一个代码为返回对应的数组内容,此时需要指定返回类型为 uint[] 的 memory。

接着我们需要完成如何删除一个动态数组中的指定索引元素,并且使其长度发生改变。

通过需求可知,我们必然会使用到 pop 方法,那么如何使用 pop 方法呢?首先我们要删除指定索引,那么指定索引的位置的值必将删除,则说明该索引位置的值无效,那么接下来我们还需要使数组的长度-1.那么此时我们可以想到,数组长度减1后那么数组最后一个值将会丢失,此时只需要将最后一个位置的值放到删除索引位置的值上,再执行 pop 是不是就ok了?所以代码如下:

function removeVal(uint index)external{
    require(index<number.length,'index out of array');
    number[index]=number[number.length-1];
    number.pop();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

完整代码如下:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.6;
contract ArrayDemo{
    uint[] public number=[1,2,3];
    uint[3] public number2=[1,2,3];

    function push(uint val)external{
        number.push(val);
    }
    function pop()external{
        number.pop();
    }
    
    function deleteVal()external{
        delete number[number.length-1];
    }

    function createArray()external pure{
        uint[] memory ages = new uint[](3);
    }

    function getArray()external view returns(uint[] memory){
        return number;
    }

    function removeVal(uint index)external{
        require(index<number.length,'index out of array');
        number[index]=number[number.length-1];
        number.pop();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

三、映射 map

映射其实就是map 或者是 字典,在 solidity 中创建一个 映射示例如下:

mapping(address=>uint) public balances;

  
 
  • 1

映射的创建使用 mapping,在后的圆括号中编写映射的类型,如上示例为 key 为 address value 为 uint,这个映射变量名为 balances,映射中可以存在映射,例如:

mapping(address=>mapping(address=>uint)) public balances1;

  
 
  • 1

设置一个 map 值的方式也很简单,如下 function :

function  setMapVal(address key,uint val)external{
    balances[key]=val;
}

  
 
  • 1
  • 2
  • 3

文章来源: i1bit.blog.csdn.net,作者:1_bit,版权归原作者所有,如需转载,请联系作者。

原文链接:i1bit.blog.csdn.net/article/details/126782849

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。