99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

映射類型

2022-05-12 09:58 更新

映射類型使用語法,映射類型的變量使用語法聲明。可以是任何內(nèi)置值類型、、或任何合約或枚舉類型。不允許使用其他用戶定義或復(fù)雜類型,例如映射、結(jié)構(gòu)或數(shù)組類型。 可以是任何類型,包括映射、數(shù)組和結(jié)構(gòu)。mapping(KeyType => ValueType)mapping(KeyType => ValueType) VariableNameKeyTypebytesstringValueType

您可以將映射視為哈希表,它實(shí)際上已初始化,使得每個(gè)可能的鍵都存在并映射到字節(jié)表示全為零的值,即類型的默認(rèn)值。相似性到此為止,關(guān)鍵數(shù)據(jù)不存儲(chǔ)在映射中,僅使用其keccak256散列來查找值。

因此,映射沒有長(zhǎng)度或設(shè)置的鍵或值的概念,因此如果沒有有關(guān)已分配鍵的額外信息,就無法擦除(請(qǐng)參閱清除映射)。

映射只能有一個(gè)數(shù)據(jù)位置,storage因此可以用于狀態(tài)變量,作為函數(shù)中的存儲(chǔ)引用類型,或者作為庫(kù)函數(shù)的參數(shù)。它們不能用作公開可見的合約函數(shù)的參數(shù)或返回參數(shù)。這些限制也適用于包含映射的數(shù)組和結(jié)構(gòu)。

您可以將映射類型的狀態(tài)變量標(biāo)記為public,Solidity 會(huì)為您創(chuàng)建一個(gè) getter。KeyType成為 getter 的參數(shù)。如果ValueType是值類型或結(jié)構(gòu),則 getter 返回ValueType. 如果ValueType是數(shù)組或映射,則 getterKeyType遞歸地為每個(gè) 具有一個(gè)參數(shù)。

在下面的示例中,MappingExample合約定義了一個(gè)公共balances 映射,鍵類型為addressa ,值類型為 a uint,將以太坊地址映射到無符號(hào)整數(shù)值。作為uint值類型,getter 返回一個(gè)與類型匹配的值,你可以在MappingUser 合約中看到返回指定地址的值。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract MappingExample {
    mapping(address => uint) public balances;

    function update(uint newBalance) public {
        balances[msg.sender] = newBalance;
    }
}

contract MappingUser {
    function f() public returns (uint) {
        MappingExample m = new MappingExample();
        m.update(100);
        return m.balances(address(this));
    }
}

下面的示例是 ERC20 代幣的簡(jiǎn)化版本。 _allowances是另一個(gè)映射類型中的映射類型的示例。下面的示例_allowances用于記錄允許其他人從您的帳戶中提取的金額。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.22 <0.9.0;

contract MappingExample {

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        require(_allowances[sender][msg.sender] >= amount, "ERC20: Allowance not high enough.");
        _allowances[sender][msg.sender] -= amount;
        _transfer(sender, recipient, amount);
        return true;
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(_balances[sender] >= amount, "ERC20: Not enough funds.");

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)