在 Move 中,我們可以使用泛型來定義不同輸入資料類型的函數和結構。泛型是庫程式碼的一個很好的構建塊。在本節中,我們將使我們的簡單BasicCoin模組變得通用,以便它可以作為可供其他使用者模組使用的庫模組。
首先,我們將類型參數新增到資料結構:
struct Coin<phantom CoinType> has store {
value: u64
}
struct Balance<phantom CoinType> has key {
coin: Coin<CoinType>
}
我們也以相同的方式將類型參數新增到我們的方法中。例如,withdraw變成如下:
fun withdraw<CoinType>(addr: address, amount: u64) : Coin<CoinType> acquires Balance {
let balance = balance_of<CoinType>(addr);
assert!(balance >= amount, EINSUFFICIENT_BALANCE);
let balance_ref = &mut borrow_global_mut<Balance<CoinType>>(addr).coin.value;
*balance_ref = balance - amount;
Coin<CoinType> { value: amount }
}
看一下step_6/BasicCoin/sources/BasicCoin.move完整的實作。
此時,熟悉以太坊的讀者可能會注意到,該模組與ERC20 代幣標準具有類似的用途,它提供了在智能合約中實現可互換代幣的介面。使用泛型的一個關鍵優點是能夠重複使用程式碼,因為泛型庫模組已經提供了標準實現,並且實例化模組可以透過包裝標準實現來提供客製化。
我們提供了一個名為的小模組MyOddCoin,用於實例化Coin類型並自訂其傳輸策略:只能傳輸奇數個硬幣。我們還包括兩個 測試來測試此行為。您可以使用在step2 和step 5 中學到的命令來執行測試。