Remix

如果通過或 msg.sender 返回地址的函式

  • January 3, 2019

我正在實施 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;
}

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/64920