In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-01-16 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Internet Technology >
Share
Shulou(Shulou.com)06/01 Report--
这篇文章主要介绍"solidity复杂类型Data_Location怎么运用",在日常操作中,相信很多人在solidity复杂类型Data_Location怎么运用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"solidity复杂类型Data_Location怎么运用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
简介
对于复杂类型例如array,struct都有一个都有一个额外的注解(annotation),可能是storage,memory,calldata之一。根据上下文总是有一个默认的注解类型。但是一般可以通过storage和memory关键字显示的修改。
对于函数的出参和入参一般默认的是memory类型(external 函数的入参例外是强制的calldata类型)
对于局部变量默认的是storage类型(可以通过memory修改)
对于状态变量强制的是storage类型(不能通过memory修改)
关于Data Locationstorage
会写入区块链中
memory
不会持久化(不会写入到区块链中)
calldata
不可修改,不可持久化
关于局部变量和状态变量pragma solidity ^0.4.18;contract DL{ uint [] stateVariable;//状态变量(state variable) function normal(uint [] inArg) public returns(uint outArg){ uint [] localVar;//局部变量(本地变量,local variable) return 0; } function cd(uint [] inArg) external returns(uint outArg){ return 0; }}
上面代码的stateVariable就是状态变量,inArg就是入参,outArg就是出参
stateVariable的data location就是storage
localVar是局部变量,data location是memory
函数normal的inArg的data location是memory outArg也是memory
函数cd的inArg的data location是calldata outArg是memory
总结强制的 data location:
external 函数的入参: calldata
状态变量:storage
默认的 data location:
一般函数的入参和出参(返回参数):memory
所有局部变量:storage
storage与memory之间的赋值
public的函数的入参的data location不能是storage
function storaegPara(Person storage allen) public returns(uint8 age,string name){ person = allen; return (person.age,person.name);}
像上面这种就会出编译错误。
局部变量的memory不能赋值给局部变量的storage,但是可以赋值给状态变量的storage
pragma solidity ^0.4.18;contract DL{ struct Person{ uint8 age; string name; } Person person = Person({age:20,name:"tim"});//状态变量,强制storage(state variable) function storaegPara(Person storage allen) internal returns(uint8 age,string name){ person = allen; return (person.age,person.name); } function testStoraegPara() returns(uint8 age,string name){ Person allen = Person({age:22,name:"allen"}); return storaegPara(allen); }}
像上面的就会编译错误。从前面我们知道:
Person allen = Person({age:22,name:"allen"});
等价于:
Person memory allen = Person({age:22,name:"allen"});
当调用storaegPara(allen)的时候,相当于把一个memory的局部allen变量赋值给一个storage的局部变量allen。
这是因为storage是静态分配存储空间的,对于storage的赋值,更像是对指针的赋值。
pragma solidity ^0.4.18;contract DL{ struct Person{ uint8 age; string name; } Person person = Person({age:20,name:"tim"});//状态变量,强制storage(state variable) function storaegPara(Person memory allen) internal returns(uint8 age,string name){ person = allen; return (person.age,person.name); } function testStoraegPara() returns(uint8 age,string name){ Person memory allen = Person({age:22,name:"allen"}); return storaegPara(allen); }}
storage可以对memory进行赋值,执行的是拷贝操作。(修改新的memory变量不会影响原来storage变量)
memory对memory的赋值是引用
memory和storage赋值总结
同类赋值(memory对memory,storage对storage)是引用,相当于指针不会执行数据拷贝。
memory和storage相互赋值,执行的是数据拷贝,但是注意memory不能对局部storage赋值
memory和storage 数组
对于变长数组必须使用new初始化之后才能访问
new 产生的是memory类型的,不能转换为局部的storage,所以可以看到在函数中下面的代码是会出编译错误的:
uint [] storage data = new uint[](1);
对于storage的变长数组,可以通过给length赋值调整数组长度。还可以使用后面提到的push()方法,来隐式的调整数组长度
对于memory的变长数组,不支持修改length属性,来调整数组大小。memory的变长数组虽然可以通过参数灵活指定大小,但一旦创建,大小不可调整
到此,关于"solidity复杂类型Data_Location怎么运用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.