Ethers.js
ethers.js 如何使用列舉參數呼叫重載函式
Ethers 通常不允許您像這樣呼叫重載函式
contract.overloaded(1)
,但它確實允許您使用像這樣的完全限定函式名來呼叫它contract["overloaded(uint)"](1)
。但是,我現在有一個將 anenum
作為輸入的函式,但我不知道如何為此進行完全限定的函式呼叫。考慮範例合約pragma solidity ^0.8.6; contract MyContract { enum MyEnum{ ZERO, ONE} function unique(MyEnum _enum) public view returns(uint) { if (_enum == MyEnum.ZERO) { return 0; } else { return 1; } } function overloaded() public view returns(uint) { return 0; } function overloaded(MyEnum _enum) public view returns(uint) { if (_enum == MyEnum.ZERO) { return 0; } else { return 1; } } }
現在我可以呼叫非重載函式或沒有
enum
s 作為參數的重載函式(都返回 0,表明enum
唯一函式中的輸入被正確解析):const ethers = require("ethers"); const MyContract = await ethers.getContractFactory("MyContract"); myContract = await MyContract.deploy(); await myContract.deployed(); console.log(await myContract.unique(0)); console.log(await myContract["overloaded()"]());
但是,如果我嘗試使用
enum
這樣的參數呼叫重載函式
console.log(await myContract["overloaded(MyEnum)"](0));
或者像這樣
console.log(await myContract["overloaded(enum)"](0));
我總是收到類似**
TypeError: myContract.overloaded(MyEnum) is not a function
or的錯誤TypeError: myContract.overloaded(enum) is not a function
**。我在ethers 文件中也找不到呼叫重載函式的語法
好的,我找到了答案 -
enum
s 在uint8
內部被solidity 處理,所以myContract["overloaded(uint8)"](0)
有效。把這個留在這裡,以防它幫助任何人。