Calldata
如何呼叫需要字元串 calldata 作為輸入參數的函式?
我有一個函式,它有一個輸入參數作為字元串呼叫數據。我不知道如何將字元串傳遞給這個函式。簡單的解決方案給了我一個編譯錯誤,因為它無法將 string_literal 轉換為類型字元串呼叫數據。如果可能的話,我不想更改函式 f 的簽名。如果您有任何想法,請幫助我。
constructor(uint160 _magic) { f("abcde"); } function f(string calldata s) public allow { emit FF(s); }
pragma solidity 0.8.7; contract Test { constructor(uint160 _magic) { this.f("abcde"); } function f(string calldata s) external { // emit FF(s); } }
這行得通。您需要
external
可見性並使用 f 呼叫this.f("abcde")
。我註釋掉了該emit
事件並刪除了allow
修飾符並在 Remix 上進行了測試。
- 接受 calldata 的函式必須在外部呼叫。Calldata 是只讀的,通過區塊鏈呼叫生成。
- 合約可以通過呼叫 as 在外部呼叫自己
this.f("abdce");
- 在建構合約時,您不能對您的某個函式進行外部呼叫。因為,
this
在將合約寫入區塊鏈並為合約生成地址之前,合約是未知的。- 我可以建議實現另一個函式,
this.f("abdce");
該函式在部署合約後呼叫並呼叫該函式一次。不要忘記製作它,onlyOwner
或者您可以將其實現為只執行一次。