Skip to main content

Solidity 数组切片

数组切片(array slice)是基于数组建立的视图(view)。其语法为 arr[start:end] 。视图包含的是从 startend-1 的元素。与数组不同的是,视图是没有类型的,也不能占据存储空间。它是为了方便我们对数据进行处理的一种抽象方式。

多种数组切片表示方式

如下图所示,底层数组 arr 一共有5个元素 [0, 1, 2, 3, 4] 。那么 arr[1:4] 的视图被涂成墨绿色,一共是3个元素。根据前面的定义,我们知道 start=1end=4 。所以其包含的是从下标1到下标(4-1)=3的元素。

其中 startend 都是可以被省略的。如果省略了 start ,那么会包含从 0end-1 的元素:

如果省略了 end 那么会包含 startarr.length - 1 的元素:

如果 startend 都省略了,那么会包含 arr 所有元素:

数组切片示例

下面展示了一个数组切片截取字符串前4bytes的示例:

数组切片截取字符串前4bytes
// 如果输入"abcdef",将会输出"abcd"(此处输出为伪代码)
function extracFourBytes(string calldata payload) public view {
string memory leading4Bytes = string(payload[:4]);
console.log("leading 4 bytes: %s", leading4Bytes);
}
//完整代码
// contract StringExtractor {
// Event for logging
// event LogString(string indexed output);

// Function to extract the first four bytes of a string input
// function extractFourBytes(string calldata payload) public {
// bytes calldata payloadBytes = bytes(payload);
// bytes memory leading4Bytes = new bytes(4);

// for (uint i = 0; i < 4 && i < payloadBytes.length; i++) {
// leading4Bytes[i] = payloadBytes[i];
// }

// Emit the result as a string
// emit LogString(string(leading4Bytes));
// }
试一试 »

数组切片只能作用于 calldata

caution

目前只能对 calldata 使用数组切片。 memorystorage 都不可以使用

目前只能对 calldata 使用数组切片,否则编译会报错。因为 calldata 数据是不可更改的,所以你也不能更改数组切片的值。

编译错误:数组切片不能用在 memory 或者 storage
uint[5] storageArr = [uint(0), 1, 2, 3, 4];
function foo() public {
uint[3] storage s1 = storageArr[1:4]; // 编译错误,不能对 storage 位置的数组进行切片

uint[5] memory memArr = [uint(0), 1, 2, 3, 4];
uint[3] memory s2 = memArr[1:4]; // 编译错误,不能对 memory 位置的数组进行切片
}
试一试 »