阅读(4098)
赞(10)
数组切片
2022-05-12 09:44:28 更新
数组切片是数组连续部分的视图。它们写成x[start:end], wherestart和 end是导致 uint256 类型(或隐式转换为它)的表达式。切片的第x[start]一个元素是 ,最后一个元素是。x[end - 1]
如果start大于end或end大于数组的长度,则抛出异常。
两者start和end都是可选的:默认start为数组的长度。0end
数组切片没有任何成员。它们可以隐式转换为其基础类型的数组并支持索引访问。索引访问在底层数组中不是绝对的,而是相对于切片的开头。
数组切片没有类型名称,这意味着没有变量可以将数组切片作为类型,它们只存在于中间表达式中。
笔记
到目前为止,数组切片仅针对 calldata 数组实现。
数组切片对于 ABI 解码函数参数中传递的辅助数据很有用:
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.5 <0.9.0; contract Proxy { /// @dev Address of the client contract managed by proxy i.e., this contract address client; constructor(address client_) { client = client_; } /// Forward call to "setOwner(address)" that is implemented by client /// after doing basic validation on the address argument. function forward(bytes calldata payload) external { bytes4 sig = bytes4(payload[:4]); // Due to truncating behaviour, bytes4(payload) performs identically. // bytes4 sig = bytes4(payload); if (sig == bytes4(keccak256("setOwner(address)"))) { address owner = abi.decode(payload[4:], (address)); require(owner != address(0), "Address of owner cannot be zero."); } (bool status,) = client.delegatecall(payload); require(status, "Forwarded call failed."); } }
← 数组