java循环实体类数组_实体数组
solidity
java循环实体类数组
这是Alex Pinto撰写的关于Solidity的第⼆个Aventus技术博客,这是我们区块链⼯程团队的最新成员。 您可以阅读他的第⼀篇有关 。
在许多情况下,当我们希望将⼀组相似的数据传递给函数时,这些相似数据的数量可能会或可能不会受到限制。 在这种情况下,最基本的数据类型是数组(在某些情况下,可⽤于实现更⾼级的数据结构)。 如下所⽰,我们可以毫⽆问题地传递和返回数组。
上⾯使⽤uint数组,该数组表⽰⼀个256位整数,⼤⼩不受限制。 这意味着我可以将任何正确类型的数组传递给函数。 这也意味着我必须先在getArrayMultipliedByScalar初始化返回数组,然后才能使⽤它,因为在声明outArray_ ,它不会为其元素分配任何内存(它可以具有任何⼤⼩)。
为了⽐较; 如果我使⽤固定⼤⼩的数组,如下所⽰,则会发⽣两件事:
我不再需要初始化传出数组。
如果函数接收的数组⼤⼩不为3,则编译器将返回错误。
我们可以进⾏其他类型的数组,如bool和address -约多维数组但什么?
我们可以传递固定⼤⼩的⼆维数组:
可悲的是,使⽤动态数组会更加困难。
⼀些语⾔,例如BASIC和Pascal,通过索引元组索引⼆维数组。 在这些语⾔中,数组是真正的(矩形)矩阵。 但是在C派⽣的语⾔中,多维数组是数组⽽不是矩阵。 Solidity也是如此,需要花⼀些时间来理解此类型声明的含义: uint[2][4]应该读为(uint[2])[4] ,即4个数组每个尺⼨为2。
当我们考虑动态数组时,这⼀点很重要。 我们可以同时拥有这两种:
上⾯的第⼀个⽰例是⼀个固定⼤⼩的数组,其中包含3个元素,每个元素都是⼀个动态数组。 在第⼆种情况下,我们有⼀个动态数组,但是它的元素是固定⼤⼩的数组。
我在下⾯讨论如何初始化fixedSizeArray ,这是两者中最有趣的情况。 关于dynamicArray ,因为它是⼀个动态数组,所以我们⾸先必须使⽤new为其分配内存,然后才能访问固定⼤⼩的元素。 下⾯的⽰例⼯作:
多维动态数组的初始化
让我们更详细地研究⼀个类似于上⾯的⽰例:
TypeError:uint256 [3]类型的内存不能隐式转换为预期的uint256 [3]类型的存储指针。
数组fixedSizeArray和dynamicArray声明为协定的状态变量,因此也必须存储引⽤。 ⽆法使⽤new表达式初始化Storage阵列,因为它们
是memory类型的。 尽管如此,我们可以使⽤内存数组表达式初始化fixedSizeArray内部的每个数组,如上所⽰。
为了进⾏⽐较,我还列举了两种情况,其中我尝试将⼀个内存阵列分配给⼀个显式存储。 在构造函数中,这有效,但在第⼆个函数中⽆效。 为什么?
这是因为storageArray和localStorageArray的类型不完全相同。 前者是合同的状态变量,当在构造函数内部被引⽤时,其类型为uint256[3] storage ref (要看到这⼀点,请将赋值的正确值更改为⾮法值,例如7,并显⽰错误消息会向您显⽰所涉及的类型)。 相⽐之下,localStorageArray的类型为uint256[3] storage pointer 。 细微的差别。 在第⼀种情况下,我们引⽤了存储中的位置,并且分配将存储器阵列复制到该存储中。 在第⼆种情况下,我们尝试分配给局部变量,根据 ,该局部变量仅创建对先前指针的新引⽤:
但是,对本地存储变量的分配仅分配了⼀个引⽤,即使此状态在此期间被更改,该引⽤也始终指向状态变量。
摘⾃Solidity⽂档
在上⾯的⽰例中, y是指向相同位置的指针,称为x ,修改其中⼀个会导致另⼀个发⽣变化。 但是在我们的例⼦中,我们试图将⼀个内存数组分配给⼀个存储变量,该变量的类型不同,⽆法产⽣指向该内存位置的指针。
另⼀⽅⾯,当我们初始化fixedSizeArray ,实际上是指存储引⽤。 在这种情况下,我们可以从⼀个内存阵列进⾏分配,这具有在⽬标上完全复制源,擦除其所有先前内容的效果。
我们可以将多维数组传递给函数吗?
这取决于!
我们可以使⽤Solidity的多态性来编写四个具有相同名称和不同签名的函数,从⽽探索动态和固定⼤⼩的⼆维数组的所有组合。
这些函数中的两个是⾮法的,只是因为它们的特定数组类型⽆法传递给函数。 ⾮法是⼀个很强的词:错误表明可以使⽤该类型,但只能⽤于新的实验性ABI编码器; 为了使⽤它,必须包含pragma experimental ABIEncoderV2; 。 但是,我们将得到警告,说它不应在⽣产代码中使⽤。
随着新版本的Solidity的出现,将来可能会取消此限制,但是⽬前,我只是不使⽤这些功能,⽽是寻求解决⽅法。
这两种类型之间的共同特征是数组的内部类型 (即其元素的类型)是动态的,⼤⼩未知。 这些类型不能传递给函数也不能从函数返回。
我将⽤另⼀个⽰例来结束这篇⽂章:
最后两个功能是⾮法的。 之所以与之前所说的⼀切⾮常⼀致,是因为string和bytes是动态类型。 具体来说,它们是数组:分别为UTF-8字符和字节的数组 。 因此,上述返回类型并不是像getInts和getAddresses那样的真正简单的⼀维数组,⽽是具有动态内部类型的⼆维数组。因此,在Solidity的当前阶段不能将它们传递到函数中或从函数中返回。
关于作者
Alex是Aventus的软件⼯程师,在区块链⼯程团队中⼯作。 他在技术领域拥有20年的⼯作经验,并获得了计算机科学博⼠学位以及密码学博⼠学位。 作为研究的⼀部分,Alex 有关Kolmogorov复杂性,密码学,数据库匿名化和代码混淆的论⽂。
Alex还曾在Maia⼤学学院任教七年,包括指导理学学⼠学位计算机科学和信息系统与软件的学位课程。
java循环实体类数组

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。