想知道是否有可能在字符串内存和字符串calldata之间进行转换,以便使用string string : end形式的索引,它只支持字符串calldata。这个函数似乎起作用了:
function splice(string calldata source, int startPos, int numchars) public pure returns(string memory) {
if (startPos > int(length(sourcestring))) return "";
int start = startPos -1;
int end = startPos + (numchars -1);
string memory retval = string(source[uint(start) : uint(end)]);
return retval;
}但是如果我将参数source更改为string memory,就会在string memory retval = string(source([uint(start) : uint(end)])上得到一个错误,因为显然,获取子字符串的形式sourcestring[start : end]适用于calldata字符串,而不是memory字符串,并且没有明显的方法将string memory转换为string calldata。
有什么方法可以做到这一点吗?
发布于 2021-08-28 19:24:23
Calldata为只读。您可以将calldata变量解码到内存中,但反之亦然。
不幸的是,数组切片仅针对calldata实现。对于内存和存储,它有点复杂,还没有实现(参见问题#7423)。
在您的例子中,解决方法是一个接一个地复制字符,这实际上是编译器在幕后所做的事情,因为您正在尝试从公共函数返回切片(这将把切片实体化为数组)。
发布于 2021-08-26 01:42:30
可能不是,因为calldata是用于在进行外部事务时提供的数据。与存储相比,其用途截然不同。
https://stackoverflow.com/questions/68874808
复制相似问题