如何成为区块链开发者-7:复杂数据类型

本文介绍了Solidity中的两种复杂数据类型:结构体(Struct)和映射(Mapping)。结构体用于创建自定义数据类型,类似于面向对象编程中的类,而映射则类似于字典,用于存储键值对。文章通过代码示例详细解释了它们的用法,并结合一个账户管理的智能合约,展示了如何在实际应用中同时使用结构体和映射,最后还简单介绍了storage, memory, calldata。

你好,又是新的一期。在上一集中我们稍微谈了一下错误处理。在这一集中,我们将讨论一些复杂的数据类型。有各种各样的复杂数据类型,如数组、字符串、结构体和映射,但我们只在本集中讨论最常用的结构体和映射。如果你对面向对象编程略知一二,你会很快适应,但即使你不知道也没问题。我将从头开始解释一切。我是说,真的。从头开始。

让我们从结构体开始。

我希望你对希腊哲学感兴趣。因为我们将稍微谈谈柏拉图关于现实的范式。

柏拉图一直在质疑是什么让事物被分类成它们被分类的方式。例如,有很多猫,而且它们彼此都不一样。但我们都把它们归类为“猫”。但是是什么让一只猫成为一只猫呢?在这一点上,柏拉图声称存在一种超越我们感官的现实。我们看不到它,听不到它,也触摸不到或闻不到它。这是一个理念的世界,世界上的一切都是存在于这个“理想世界”中的事物的反映。因此,在这个理想世界中存在一个猫的理念,地球上的每一只猫都只是那个“猫理念”的反映。至少我可以把它说得这么基本。

现在我希望你这样看待结构体数据类型。想象一下,我们用我们的结构体类型创造了一个猫的理念,我们创造了一些反映这个理念的实例。让我们看看下面的代码。

仔细看看我们是如何创建一个结构体的。我们说 struct,输入结构体的名称,最后我们想谈谈这个结构体将具有什么样的属性。我们在这里所做的只不过是创造一个猫的理念。我们说,一只猫肯定应该具有这些属性。当然,我们创造它的方式不如上帝的好,我们无法真正地将一只猫在现实生活中的所有属性都包含在这个合约中。但我们会尽力而为:)

现在我们创造了这个理念,我们如何创建一个猫的实例呢?

我想说,这是一个很长的函数声明。所以让我告诉你我们在这里做了什么。我们为这个函数准备了三个参数。猫的名字、年龄和品种。这些是我们将要分配给创建的猫实例的参数。为了创建一个实例,我说:

StructName storagePlace theNameOfTheInstance;

在我们的例子中,创建了属于“Cat”结构体的“cat”实例,并将这些数据存储在 memory 中。我将解释“存储在 memory 中”是什么意思。

在我创建了我的实例之后,我可以访问它的属性并给它们赋值。我可以通过 cat.name 访问猫的名字,并按照我想要的方式给它赋值。年龄和品种也是如此。在分配了所有属性之后,我就有了一个完整的猫实例。让我们试试看。

当我们调用这个函数时,它返回一个元组,一个类似数组的数据类型,我们可以访问其中的参数。这就是结构体的工作方式。你只需创建一个理念,然后创建一个反映该理想形式的实例。

稍后我将通过编写示例合约来向你展示如何使用它以及它的用途。但现在,让我们跳到映射。

映射非常像字典。想象一下字典是如何工作的,它有一个单词,每个单词旁边都有定义。映射就是以这种方式构建的。你有一个 key,然后你给它分配一个 value。让我们看看。

当我们声明一个映射时,我们首先说“mapping”,然后在括号中输入 key,它是第一个参数,然后我们选择我们想要分配的相应 value。

在上面的例子中,我想在映射中放入一些字母,并想记录它们在字母表中的顺序。为了修改这个映射,我构建了一个函数。它接受字母并为其分配一个数字。我们来看看。

现在我们的 key 是 A,分配给 A 的 value 是 1(因为它在字母表中是第一个)。让我们现在查看这个映射。

当我想看看分配给 A 的是什么时,我输入 A 然后点击 call。它只是返回给我 1,这是我们之前分配给 A 的。现在我知道你可能有很多关于发生了什么的疑问,所以为什么不编写一个同时包含结构体和映射数据类型的合约呢?

让我们看看这里有什么。

1- 我们首先有一个名为 Account 的结构体。这是帐户的理念,我们确定了其中有哪些属性。我们将为每个帐户实例设置一个名称、一个年龄和一个 ETH 余额。

2- 然后我们有一个映射,我们用它来跟踪每个帐户。我们有帐户地址,并将帐户实例分配给这些地址。现在这是这两种类型的真正用法,对吧? :)

3- 我们有一个函数来创建帐户实例,并将它们分配给地址。我们首先创建实例,在该实例中分配属性,然后我们将整个帐户数据分配给相关的地址。

4- 我们有一个函数来将 ETH 部署到合约,我们基本上增加了帐户中的 ethBalance 属性,以跟踪帐户余额。

现在部署这个合约,看看它是如何工作的。

我现在将以我的名义创建一个帐户。然后我将复制我的地址并将其粘贴到帐户部分,以查看我的帐户数据。

看到了吗?那是我的名字、我的年龄和我的 ETH 余额。现在我将我的 value 设置为 1,点击 deployEth 按钮,然后再次查看我的帐户数据。

看到了吗,它更新了我的帐户余额。现在,我想切换到另一个地址,然后再次执行相同的操作。

这样,我将所有帐户数据存储在映射中并查看它们。这是结构体和映射的实时用法,我个人在我的项目中使用过它。

现在我们已经完成了最重要的数据类型。我们将继续讨论在哪里存储所有这些数据。我们有三个关键字:storage、memory 和 calldata。

在 Solidity 中,当我们在合约中声明一些变量时,它别无选择,只能存储在合约中。这表明数据将存储在区块链中,并且在那里是安全的。这种存储数据的方式就是我们所说的“storage”。

同样,当你声明一个函数并为其提供一些参数时,这些参数将在函数执行后被删除。我们为这些用法使用“memory”或“calldata”。

memory 和 calldata 之间的区别在于,当你将一个参数标记为 memory 时,它可以在函数内部被更改。就像我们在合约内部所做的那样。我们有一个帐户实例,我们更改了它的数据,该帐户的属性。然后我们将该临时变量分配给我们在合约上存储的 storage 变量。最后,当函数完成时,我们创建的“帐户”实例就会消失。

我通常在我的项目中使用 memory,并且不认为其他两个被广泛使用,但无论如何,你应该了解它们。只需记住,在区块链上存储数据需要花钱,并且在这一方面,storage 可能会很昂贵。

好了,伙计们,这就是我今天想谈的全部内容。在下一集中,我认为这将是我们 Solidity 的最后一集,我们将主要讨论“继承”这个术语。再见!

  • 原文链接: coinsbench.com/how-to-be...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
CoinsBench
CoinsBench
https://coinsbench.com/