2017-09-28 6 views
0

どのようにして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; 
} 
} 

答えて

1

基本的には、マッピングは他のプログラミング言語の辞書またはマップと同等です。 Key-to-Valueストレージです。

標準的な配列では、インデックスルックアップです。 10個の要素が配列に存在する場合、インデックスは0 - 9、それは整数の配列として、次のようになります。

またはコードで:

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]; 
} 

:これは整数へのアドレスのマップだったのであれば、それは次のようになりますショート。キーも順番に並ぶ必要はありません。

+1

良い説明。また、ここではマッピングについて説明します。https://ethereum.stackexchange.com/questions/9893/how-does-mapping-in-solidity-work Solidityのマッピング内にマッピングを持つことが可能です;) –

関連する問題