首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solidity元素访问

Solidity元素访问
EN

Ethereum用户
提问于 2018-02-21 15:30:55
回答 1查看 912关注 0票数 1

在特弗斯的宠物店教程里。Adoption.sol是--

代码语言:javascript
复制
pragma solidity ^0.4.19;

contract Adoption {
    address[16] public adopters;

    // Adopting a pet
    function adopt(uint petId) public returns (uint) {
        require(petId >= 0 && petId <= 15);

        adopters[petId] = msg.sender;

        return petId;
    }   
}

TestAdoption.sol是--

代码语言:javascript
复制
pragma solidity ^0.4.19;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Adoption.sol";

contract TestAdoption {
    Adoption adoption = Adoption(DeployedAddresses.Adoption());

    // Testing retrieval of a single pet's owner
    function testGetAdopterAddressByPetId() public {
        // Expected owner is this contract
        address expected = this;

        address adopter = adoption.adopters(8);

        Assert.equal(adopter, expected, "Owner of pet ID 8.");
    }   
}

我的问题是address adopter = adoption.adopters(8); in TestAdoption.sol,我认为adoption.adopters是一个数组,它的元素应该通过[8]而不是(8)访问。

然而,马弗斯的代码是正确的。实际上,将(8)更改为[8]将导致可靠的编译错误--

代码语言:javascript
复制
TypeError: Indexed expression has to be a type, mapping or array (is function (uint256) view external returns (address))
        address adopter = adoption.adopters[8];
                          ^---------------^

背后的理论是什么?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-02-21 15:34:39

无法从另一份合同直接访问这些字段。address[16] public adopters中的public关键字将生成一个名称相同的getter函数,因此是adoption.adopters(8)

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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