W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
映射類型使用語法,映射類型的變量使用語法聲明??梢允侨魏蝺戎弥殿愋?、、或任何合約或枚舉類型。不允許使用其他用戶定義或復雜類型,例如映射、結構或數組類型。 可以是任何類型,包括映射、數組和結構。mapping(KeyType => ValueType)mapping(KeyType => ValueType) VariableNameKeyTypebytesstringValueType
您可以將映射視為哈希表,它實際上已初始化,使得每個可能的鍵都存在并映射到字節(jié)表示全為零的值,即類型的默認值。相似性到此為止,關鍵數據不存儲在映射中,僅使用其keccak256散列來查找值。
因此,映射沒有長度或設置的鍵或值的概念,因此如果沒有有關已分配鍵的額外信息,就無法擦除(請參閱清除映射)。
映射只能有一個數據位置,storage因此可以用于狀態(tài)變量,作為函數中的存儲引用類型,或者作為庫函數的參數。它們不能用作公開可見的合約函數的參數或返回參數。這些限制也適用于包含映射的數組和結構。
您可以將映射類型的狀態(tài)變量標記為public,Solidity 會為您創(chuàng)建一個 getter。KeyType成為 getter 的參數。如果ValueType是值類型或結構,則 getter 返回ValueType. 如果ValueType是數組或映射,則 getterKeyType遞歸地為每個 具有一個參數。
在下面的示例中,MappingExample合約定義了一個公共balances 映射,鍵類型為addressa ,值類型為 a uint,將以太坊地址映射到無符號整數值。作為uint值類型,getter 返回一個與類型匹配的值,你可以在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 代幣的簡化版本。 _allowances是另一個映射類型中的映射類型的示例。下面的示例_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); } }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: