Clarity 智能合约开发教程|理解缓冲区、字符串和列表

2021-09-23 18:17:38 +08:00
 gitandgit

英文文档原地址: https://book.clarity-lang.org/ch02-02-sequence-types.html

序列

顾名思义,Sequences 序列保存数据序列。Clarity 提供了三种不同类型的序列:缓冲区、字符串和列表。

缓冲区

Buffers 是固定最大长度的非结构化数据。它们总是以前缀 0x 开头,后跟一个十六进制字符串。因此,每个字节由两个所谓的十六进制表示。

0x68656c6c6f21

上面的缓冲区意思是“你好!”。 (将其复制并粘贴到此页面以进行验证。)

字符串

String 是一个字符序列。这些可以定义为 ASCII 编码字符串或 UTF-8 编码字符串。ASCII 字符串可能只包含基本的拉丁字符,而 UTF-8 字符串可以包含有趣的东西,比如表情符号。两种字符串类型都用双引号 (") 括起来,但 UTF-8 字符串也以 u 为前缀。就像缓冲区一样,字符串在 Clarity 中始终具有固定的最大长度。

ASCII 编码:

"This is an ASCII string"

UTF-8 编码:

u"And this is an UTF-8 string \u{1f601}"

您可以使用字符串来传递名称和消息。

列表

Lists 列表是包含另一种类型的具有固定长度的序列。由于类型不能混合,一个列表只能包含相同类型的项目。以这个有符号整数列表为例:

(list 4 8 15 16 23 42)

如您所见,列表是使用 list 函数构造的。这是一个 ASCII 字符串列表:

(list "Hello" "World" "!")

为了完整起见,下面的示例是一个由于混合类型而无效的列表:

(list u5 10 "hello") ;; This list is invalid.

列表非常有用,可以更轻松地执行批量操作。 (例如,将一些代币发送到一个列表中的一些用户。)您可以使用 map 或 fold 函数迭代列表。

map 对每个元素执行一个输入函数,并返回一个包含更新值的新列表。not 函数反转布尔值( true 变为 false,false 变为 true )。因此,我们可以像这样反转布尔值列表:

(map not (list true true false false))

fold 将输入函数应用于列表的每个元素和前一个应用程序的输出值。它还需要一个初始值用于第一个元素的第二个输入。返回的结果是最终应用程序返回的最后一个值。此函数通常也称为 reduce,因为它将列表缩减为单个值。我们可以使用 fold 通过应用初始值为 u0 的 +(加法)函数来对列表中的数字求和:

(fold + (list u1 u2 u3) u0)

上面的代码段可以扩展为以下内容:

(+ u3 (+ u2 (+ u1 u0)))

使用序列

长度

序列总是有一个特定的长度,我们可以使用 len 函数检索它。

缓冲区示例(请记住,每个字节表示为两个十六进制):

(len 0x68656c6c6f21)

字符串示例

(len "How long is this string?")

列表示例

(len (list 4 8 15 16 23 42))

检索元素

它们还允许您提取特定索引处的元素。下面从列表中取出第四个元素。 (从 0 开始计数。)

(element-at (list 4 8 15 16 23 42) u3)

您也可以反向操作并在序列中查找特定项目的索引。我们可以搜索列表以查看它是否包含值 23 。

(index-of (list 4 8 15 16 23 42) 23)

我们得到的结果是( some u4 ),表明在索引 4 这个位置的值为 23 。细心的人现在可能想知道,这个“some”是什么?请继续阅读,所有内容将在下一节中揭晓。

462 次点击
所在节点    区块链
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/803714

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX