Remix
如果通過或 msg.sender 返回地址的函式
我正在實施 ERC721 契約,我想執行以下邏輯。
這就是我想要的:如果使用者將地址傳遞給方法,則返回該地址,如果沒有,則返回使用者的地址。
我一直在玩混音,我有這個方法:
function showsender(address passsedAdd) public view returns(address) { address addToReturn; if(passsedAdd==address(0)) { addToReturn = msg.sender; } else { addToReturn = passsedAdd; } return addToReturn; }
但是,我無法讓它按我的意願工作,因為它看起來在 Solidity 中參數不是可選的。
所以,執行 testS… 如果我通過 arg,例如:
console.log( await this.contract.showsender( '0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C' ) );
有效,但如果我嘗試這樣做,如果使用者沒有明確傳遞參數,它不會:this.contract.showsender();
我對 Solidity 完全陌生。任何人都可以幫忙嗎?
你可以定義一個沒有地址的函式:
function showSender() public view returns (address) { return(msg.sender); }
和具有相同名稱和地址的第二個函式
function showSender(address passedAddress) public view returns (address) { return(passedAddress); }
他們可以同時在同一個契約中,沒有問題或乾擾。像這樣:
contract MyContract { function showSender() public view returns (address) { return(msg.sender); } function showSender(address passedAddress) public view returns (address) { return(passedAddress); } }
當您的使用者在沒有參數的情況下呼叫 MyContract.showSender 時,他會點擊第一個,通過地址傳遞他會點擊第二個。
繼續了解如何在傳遞/不傳遞地址的情況下生成此類呼叫,但這是另一個故事……😉
正如 Shane 所說,函式參數不是可選的,儘管如果以下內容不適合您的案例,您可能會考慮重載。
你可以這樣做:
function showSender(address passedAddr) public view returns(address) { if(passedAddr == address(0) return msg.sender; return passedAddr; }
希望能幫助到你。