如果我有以下合同:
contract A {
uint[1] public MyArray;
constructor() public {
MyArray[0] = 56;
}
}我想通过从另一份合同中查找MyArray的大小来了解它的大小。天真地,我会认为这是可行的:
contract B {
function getsize() public view returns (uint) {
A contr = A(addressOfA);
uint size = contr.MyArray.length;
return size;
}
} 我得到的错误是:
TypeError:在参数依赖的函数(uint256)视图外部返回(uint256)后找不到或看不到成员“长度”。uint = contr.MyArray.length;
这是否意味着contr.MyArray不被视为数组?有办法让长度这么长吗?理想情况下,我希望避免在contract A中编写任何getter,因为我试图减少contract A中的代码大小。
谢谢
发布于 2020-12-21 02:05:46
Solidity自动为公共状态变量创建getter函数。例如,以下内容将起作用:
contract A {
uint256 public foo = 1;
}
contract B {
A a;
function getFoo() public view returns (uint256) {
return a.foo();
}
}但是,在数组的情况下,只能从数组中获得一个元素,而不能从整个数组中获得一个元素。从坚实的文档中:
如果有数组类型的
public状态变量,则只能通过生成的getter函数检索数组的单个元素。这种机制的存在是为了避免在返回整个阵列时的高性价比。可以使用参数指定要返回的单个元素,例如data(0)。如果您想在一个调用中返回整个数组,则需要编写一个函数。
基本上,虽然您可以执行以下操作:
contract A {
uint256[] public foo;
}
contract B {
A a;
function getFoo() public view returns (uint256) {
return a.foo(0); // Get item at index 0 from the array
}
}不能使用a.foo()读取整个数组,因此必须使用getter函数,例如:
contract A {
uint256[] public foo;
function getFooLength() public view returns (uint256) {
return foo.length;
}
}
contract B {
A a;
function getFoo() public view returns (uint256) {
return a.getFooLength();
}
}https://ethereum.stackexchange.com/questions/91356
复制相似问题