映射的工作方式起作用,并且映射类似于其他流行语言的另一个概念



任何人都可以解释mapping的工作原理,以及为什么使用它?就像阵列一样是项目的集合。我没有坚固的经验,我才刚刚开始。我在"坚固性官方文档"页面上找到了此代码。

pragma solidity ^0.4.11;
Contract CrowdFunding {
// Defines a new type with two fields.
struct Funder {
    address addr;
    uint amount;
}
struct Campaign {
    address beneficiary;
    uint fundingGoal;
    uint numFunders;
    uint amount;
    mapping (uint => Funder) funders;
}
uint numCampaigns;
mapping (uint => Campaign) campaigns;
function newCampaign(address beneficiary, uint goal) returns (uint campaignID) {
    campaignID = numCampaigns++; // campaignID is return variable
    // Creates new struct and saves in storage. We leave out the mapping type.
    campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
}
function contribute(uint campaignID) payable {
    Campaign storage c = campaigns[campaignID];
    // Creates a new temporary memory struct, initialised with the given values
    // and copies it over to storage.
    // Note that you can also use Funder(msg.sender, msg.value) to initialise.
    c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
    c.amount += msg.value;
}
function checkGoalReached(uint campaignID) returns (bool reached) {
    Campaign storage c = campaigns[campaignID];
    if (c.amount < c.fundingGoal)
        return false;
    uint amount = c.amount;
    c.amount = 0;
    c.beneficiary.transfer(amount);
    return true;
}
}

基本上,映射等于词典或其他编程语言中的地图。这是关键值存储。

在标准阵列中,这是一个索引查找,例如如果数组中有10个元素,则索引为0-9,看起来像整数数组:

[0] 555
[1] 123
...
[8] 22
[9] 5

或代码:

uint[] _ints;
function getter(uint _idx) returns(uint) {
    return _ints[_idx];
}

所有密钥都基于将它们添加到数组中的顺序。

映射略有不同,最简单的描述方法是它使用了关键的查找。因此,如果这是整数地址的地图,那么它看起来像:

[0x000000000000000A] 555
[0x0000000000000004] 123
....
[0x0000000000000006] 22
[0x0000000000000003] 6

或代码

mapping(address => uint) _map;
function getter(address _addr) returns(uint) {
    return _map[_addr];
}

基本上,您是用对象引用值而不是整数。键也不必按顺序进行。

最新更新