首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问公共数组的长度?

如何访问公共数组的长度?
EN

Ethereum用户
提问于 2020-12-21 00:08:42
回答 1查看 2.8K关注 0票数 4

如果我有以下合同:

代码语言:javascript
复制
contract A {
     uint[1] public MyArray;
     constructor() public {
         MyArray[0] = 56;
     }
}

我想通过从另一份合同中查找MyArray的大小来了解它的大小。天真地,我会认为这是可行的:

代码语言:javascript
复制
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中的代码大小。

谢谢

EN

回答 1

Ethereum用户

回答已采纳

发布于 2020-12-21 02:05:46

Solidity自动为公共状态变量创建getter函数。例如,以下内容将起作用:

代码语言:javascript
复制
contract A {
  uint256 public foo = 1;
}

contract B {
  A a;

  function getFoo() public view returns (uint256) {
    return a.foo();
  }
}

但是,在数组的情况下,只能从数组中获得一个元素,而不能从整个数组中获得一个元素。从坚实的文档中

如果有数组类型的public状态变量,则只能通过生成的getter函数检索数组的单个元素。这种机制的存在是为了避免在返回整个阵列时的高性价比。可以使用参数指定要返回的单个元素,例如data(0)。如果您想在一个调用中返回整个数组,则需要编写一个函数。

基本上,虽然您可以执行以下操作:

代码语言:javascript
复制
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函数,例如:

代码语言:javascript
复制
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();
  }
}
票数 4
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/91356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档