pragma solidity >= 0.4.25 < 0.6;
contract Bank {
struct Customer {
uint age;
}
Customer[][] customers;
function foo() public {
if (customers.length > 0) {
Customer[] storage northBranch = customers[0];
if (northBranch.length > 1) {
Customer storage customer = northBranch[1];
customer.age = 23;
}
} else {
Customer memory bob;
bob.age = 34;
customers.length += 1;
customers[0].push(bob);
}
}
}
我正在寻找函数返回的例子和调用函数时的数组。有很多例子,但是我可以找到一个函数,它返回数组,数组在里面,结构在里面。
我试过这个,但不起作用。
function get() external view returns (Customer[][]) {
/*Customer[][] memory resCustomer;
for(uint i = 0; i<customers.length;i++) {
resCustomer[i][] = customers[i][];
}*/
return (customers);
}
错误:
TypeError:这种类型只支持在新的实验ABI编码器。使用“实用化实验ABIEncoderV2;”启用该特性。
对于如何穿越主数组以获得内部数组和内部结构,我有什么想法吗?
发布于 2019-01-04 09:14:32
正如错误描述的那样,返回多维动态数组只支持作为使用ABIEncoderV2的实验特性(参见坚实性文件)。
将以下一行添加到您的合同顶部:
pragma experimental ABIEncoderV2;
你的全部合同将是:
pragma solidity >= 0.4.25 < 0.6;
pragma experimental ABIEncoderV2;
contract Bank {
struct Customer {
uint age;
}
Customer[][] customers;
function foo() public {
if (customers.length > 0) {
Customer[] storage northBranch = customers[0];
if (northBranch.length > 1) {
Customer storage customer = northBranch[1];
customer.age = 23;
}
} else {
Customer memory bob;
bob.age = 34;
customers.length += 1;
customers[0].push(bob);
}
}
function get() external view returns (Customer[][] memory) {
return (customers);
}
}
请务必使用Web3.jsv1.0.0-beta.36来使用此功能,因为从该版本开始只添加了mutli维动态数组的完整解码(请参阅web3.js#1148)。尽管如此,仍然没有很好的保证它能像预期的那样工作,因为这是一个实验性的特性。
这是一个实验性的特性,因此不建议在生产环境中使用这样的功能。也许您可以重新评估您是否真的需要将数据存储在这样的结构中,或者是否也可以使用更简单的方法。
发布于 2019-01-07 10:35:26
因为返回双动态数组(如string[]或bytes[])或结构数组还不受支持,除非您没有在代码的顶部添加行pragma experimental ABIEncoderV2;
,因此在get()
函数中可以做的是通过解包装结构返回多个值(即有坚实支撑)。
例如,您有struct。
Customer {
uint age;
address id;
bytes32 name;
}
和状态
Customer[] customers;
您可以编写get()函数如下:
function get() external view returns (uint[] memory ages, uint[] memory ids, bytes32[] names) {
ages = new uint[](customers.length);
ids = new address[](customers.length);
names = new bytes32[](customers.length);
for(uint i = 0; i<customers.length;i++) {
ages[i] = customers[i].age;
ids[i] = customers[i].id;
names[i] = customers[i].name;
}
}
由于您有客户,所以undefined试图找到一种明智的方法来打开这个结构以满足您的需要。
希望能帮上忙!
https://ethereum.stackexchange.com/questions/64644
复制相似问题