Cairo 没有原生的字符串类型,但提供了两种处理字符串的方式:使用单引号的短字符串,以及使用双引号的ByteArray。
短字符串是一种 ASCII 字符串,其中每个字符都用一个字节编码。
Cairo 中短字符串默认使用的类型是felt252,所以它的最大长度只有 31 个字符。
// below are different ways to write the same value
let name: felt252 = 'Jane'; // short string format
let name: felt252 = 0x4a616e65; // byte format
let name: felt252 = 1247899237; // decimal format
从技术上讲,任何比felt252小的整数类型都可以用短字符串格式表示。
// all of the below are equal u8 values, they are just written using different formats!
let lowercase_a_in_ascii: u8 = 'a'; // short string format
let lowercase_a_in_ascii: u8 = 0x61; // byte format
let lowercase_a_in_ascii: u8 = 97; // decimal format
对于长度超过 31 个字符的字符串,Cairo 提供了ByteArray,它的长度不受限制。
let long_string: ByteArray = "this is a string which has more than 31 characters";
ByteArray 可以通过+运算符进行拼接:
"Jane" + " " + "Austen"
// => "Jane Austen"
有些特殊字符需要用前导反斜杠转义,比如字符串中的\t表示制表符,\n表示换行。
"How is the weather today?\nIt's sunny"
// =>
// How is the weather today?
// It's sunny
你甚至可以用下标访问 ByteArray 中的单个字节。
不过要小心,返回的字节类型是u8,而不是ByteArray!
let hello: ByteArray = "Hello World!";
let exclamation_mark: u8 = hello[11];
// => 33
核心库提供了许多有用的方法和运算符来处理 ByteArray。
想了解 ByteArray 方法的更多信息,请查看 ByteArrayTrait 文档。
下面是一些例子:
let name: felt252 = 'Jane';
let mut greeting: ByteArray = "Welcome ";
// append_word appends a single word of a given number of bytes to the end of the ByteArray
greeting.append_word(name, 4);
// => "Welcome Jane"
// rev returns a ByteArray with the all characters reversed
let rev_greeting = greeting.rev();
// => "enaJ emocleW"
附近有一家叫“Tech Palace”的家电店。店老板最近安装了一块大显示屏,用来播放营销信息,还能在顾客于入口扫描会员卡时显示一句特别的问候语。这块显示屏由许多小 LED 灯组成,可以显示多行文字。
店老板需要你帮忙处理为新显示屏生成文字的代码。
对于大多数扫描会员卡的顾客,店老板希望显示屏上显示Welcome to the Tech Palace, ,后面跟上用大写字母写成的顾客姓名。
实现welcome_message函数,它接收顾客姓名作为短字符串(felt252)实参,并以ByteArray返回所需的欢迎消息。
welcome_message("Judy")
// => Welcome to the Tech Palace, JUDY
对于在店里大量购买的忠实顾客,店老板想让欢迎显示屏更花哨一些,在欢迎消息前后各加一行星号。他们还不确定每行应该有多少颗星号,所以希望这个数量可以配置。
编写一个add_border函数,接收一条欢迎消息(ByteArray)和每行星号的数量(类型为u32)作为实参。它应返回一个由 3 行组成的ByteArray:第一行是指定数量的星号,然后是原样传入的欢迎消息,最后又是一行星号。
add_border("Welcome!", 10)
应返回:
**********
Welcome!
**********
在安装这块新显示屏之前,店里有一块类似的显示屏,只能显示无法配置的固定文字行。店老板想在新显示屏上重复使用一些旧的营销信息。不过,这些数据里已经包含了星号边框和一些多余的空白字符。你的任务是清理这些信息,让它们可以重复使用。
实现一个clean_up_message函数,接收旧的营销信息,类型为ByteArray。该函数应首先从文本中移除所有星号,然后去掉剩余文本开头和结尾的空白字符。然后返回清理后的消息。
let message: ByteArray = "
**************************
* BUY NOW, SAVE 10% *
**************************
";
clean_up_message(message)
// => BUY NOW, SAVE 10%