以太坊中Solidity行 · 大金刚境:语法详解#变量的数据位置和枚举

241 阅读2分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。

以太坊中Solidity行 · 大金刚境:语法详解#变量的数据位置和枚举

本文收录于我的专栏:细讲区块链

众所周知,以太坊开发拥有四种境界:金刚境,指玄境,天象境以及陆地神仙。今天我们继续来学习Solidity的语法来深造大金刚境界。

一、变量的数据位置

在solidity中,变量的位置主要分为两类。第一类是memory,是将变量存储在内存之中。还有一类是storage,这个类型修饰的数据会被永久的存储在区块链之上。其实还有一类是calldata,该位置上的数据是只读的,并不会在区块链上持久化,一般在外部函数才会指定。

需要注意的是,状态变量如果不指定,默认是存储在storage中。而在函数之中的局部变量同样是在storage。不过函数参数以及返回值它们的默认存储位置是存储在内存之中,即memory。

下面我们来介绍数据位置之间是如何进行转换的~

先来看一看memory的数据是如何修改后还是memory的

 contract data1{
     uint[5] array = [1,2,3,4,5];
     function memoryTomemory() public returns(uint[5] memory){
         uint[5] memory s = array;
         fun1(s);
         return s;
     }
 ​
     function fun1(uint[5] memory y) public{
         y[0] = 200;
     }
 }

image-20220125164455825

这样是引用传递,会改变源数据的值。

如果memory到storage是不会改变源数据的,具体例子在此不再详述。

然后再从storage到storage和memory到memory一样也是会更改源数据的。

而storage更改为memory为数据拷贝,是并不会改变源数据的值的。

二、枚举

枚举主要用于什么方面呢?比如我们在执行某个请求时,通常状态不止两种,例如http的状态码比如404、403、200等,这时候就需要枚举。

枚举可以显式的与整型进行转换,这个转换会在运行时检测数值范围,如果范围不匹配就会触发异常。需要注意枚举至少需要一个成员。