arrays - 可以将 uint256[100] 内存转换为 uint256[10] 内存吗?
问题描述
是否可以使 getFirst10() 工作?将 uint256[100] 内存转换为 uint256[10] 内存似乎是不可能的。
contract Test {
uint256[100] private foo;
function get() external view returns (uint256[100] memory) {
return foo; // Works
}
function getFirst10() external view returns (uint256[10] memory) {
return uint256[10](foo); // Doesn't compile
}
}
我得到的最接近的是上面的尝试,但它失败并出现错误:Error: Explicit type conversion not allowed from "uint256[100] storage ref" to "uint256[10] storage pointer"
我想要做的是有一个函数返回一个大的 uint256[] 存储数组的子切片。有没有办法做到这一点?我是否必须返回 calldata 并复制每个元素?
解决方案
我认为正确的解决方案是创建一个所需固定大小的函数本地内存数组,并复制元素。在阅读了有关“存储”与“内存”的更多信息之后,我猜 EVM 在“相同大小”的情况下会为您做这件事,但除此之外似乎没有任何强制转换语法来避免编写循环自己。我不认为有性能或天然气成本影响,但可能是错误的。
function getFirst10() external view returns (uint256[10] memory) {
uint256[10] chunk;
for (uint32 j = 0; j < 10; j++) {
chunk[j] = foo[j];
}
return chunk;
}
推荐阅读
- constraints - 如何知道问题是否属于 NP 类?
- javascript - 存储在变量中的JS函数不可调用
- if-statement - 谷歌表格迷你图,带有importrange,有条件我能做到这一点吗?
- sas - SAS Data Studio 中的列总和
- kubernetes - 根据每个 pod 的活动连接数扩展 GKE pod
- magento - Authorize.net 向卡收费但订单未在 Magento 中注册的间歇性问题
- angular - Angular 8不显示数组
- javascript - 我需要在异步函数中的每个语句之前放置等待吗?
- python - 用户从 RecycleView 中选择标签后如何更改 TextInput 字段中的文本
- view - SwiftUI:水平滚动视图我能够上下拉动图像