Solidity
外部solidity函式可以在同一個合約中動態呼叫嗎?
假設我們有以下solidity合約:
contract khiar { function mooz(uint size) external { // do something with mooz! } function bademjoon(uint size) external { // do something with bademjoon and then call mooz address(this).call(abi.encodeWithSignature("mooz(uint)", size*2)); } }
如您所見,
mooz
它是一個外部函式,但我們需要bademjoon
在同一合約的函式內動態呼叫它(無論出於何種原因)。這是一個有效的呼叫還是我們需要添加public
修飾符mooz
?
這是一個有效的呼叫還是我們需要向 mooz 添加 public 修飾符?
這是一個有效的呼叫,但它是一個奇怪的案例。
你不需要添加
public
,事實上,你不能。它會觸發編譯器錯誤。請參閱有關功能可見性修飾符的文件:公共函式是合約介面的一部分,可以在內部呼叫,也可以通過消息呼叫。
和
外部函式是合約介面的一部分,這意味著它們可以從其他合約和交易中呼叫。外部函式 f 不能在內部呼叫(即 f() 不起作用,但 this.f() 起作用)。
兩者不兼容,public 允許內部呼叫,而 external 不允許。