【问题标题】:How can I access the variables of a struct that is assigned to a mapping?如何访问分配给映射的结构的变量?
【发布时间】:2021-12-19 02:32:40
【问题描述】:

我想更改已创建的结构实例的变量。我有一个 Candidate 结构分配给映射中的 address 变量,选民的地址分配给他们投票的候选人的地址。

struct Candidate {
        address candidateAddress;
        string candidateName;
        int numVotes;
    }

mapping(address => address) votes;
mapping(address => Candidate) candidates;

我已经尝试了以下

function castVote(address _address) public {
        votes[msg.sender] = _address;
        candidates[_address].numVotes += 1;
    }

这不会引发错误,但是当我测试 numVotes 对于我这样硬编码的两个测试候选者时保持为 0。

Candidate public candidateOne = Candidate(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4, "Adam Apple", 0);
    Candidate public candidateTwo = Candidate(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2, "John Doe", 0);
    
    
    function assignCand() public {
        candidates[0x5B38Da6a701c568545dCfcB03FcB875f56beddC4] = candidateOne;
        candidates[0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2] = candidateTwo;
    }

我仍然是 Solidity 初学者,因此我们将不胜感激 :) 谢谢!

【问题讨论】:

    标签: ethereum solidity smartcontracts truffle hardhat


    【解决方案1】:

    一种方法:

    function castVote(address _address) public {
                votes[msg.sender] = _address;
                Candidate storage candi = candidates[_address];
                candi.numVotes = candi.numVotes + 1; // think about using SafeMath here unless it doesn't seem to ever overflow
            }
    

    另一种方式:

    function castVote(address _address) public {
                votes[msg.sender] = _address;
                Candidate memory candi = candidates[_address];
                candi.numVotes = candi.numVotes + 1;
                candidates[_address] = candi;
            }
    

    尝试两者并比较气体使用情况。具体我记不太清了,不过会便宜一点。

    【讨论】:

    • 谢谢,但我尝试了两种方法,当我返回每个候选人的 numVotes 时,它们仍然为 0。有什么建议吗?
    • 您是否真的在代码中设置了它们?它们返回为零意味着存储单元是空的。所以你要么使用不同的地址来访问映射的值,要么根本没有设置它
    猜你喜欢
    • 2021-04-18
    • 2014-08-20
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多