如何在 Solidity 中對函式指針進行類型轉換?
我有一個接受類型參數的函式
function (uint256) view returns (uint256)
。我想向它傳遞一個指向類型函式的指針
function (uint256) pure returns (uint256)
。
pure
顯然,將這個函式傳遞給一個期望函式的參數應該沒有問題view
,因為參數和返回類型是相同的,並且pure
比view
. 但是,我得到了這個 TypeError:TypeError:函式呼叫中的參數類型無效。
function (uint256) pure returns (uint256)
從到function (uint256) view returns (uint256)
請求的隱式轉換無效。我嘗試過的事情:
將函式分配給局部變數會產生類似的 TypeError:
function(uint256) view returns(uint256) a = func;
TypeError:類型
function (uint256) pure returns (uint256)
不能隱式轉換為預期類型function (uint256) view returns (uint256)
Solidity 的常用類型轉換語法在
function
關鍵字處給出 ParserErrorfunction(uint256) view returns(uint256) a = function(uint256) view returns(uint256) (func);
ParserError:預期的主要表達式
——-
我注意到 TypeError 一直告訴我函式指針是不可
implicitly
轉換的。有沒有辦法顯式轉換它?
更新:在最近的 Solidity 版本中,純函式指針現在可以隱式轉換為視圖函式指針。
我沒有找到這個問題的解決方案,所以我在 Github 上送出了一個問題:https ://github.com/ethereum/solidity/issues/4349
我確實找到了兩種解決問題的方法:
1:降級我所有的純函式來查看。
2:使用內聯彙編賦值給一個局部變數,從而繞過Solidity類型系統:
function(uint256)view returns(uint256) a; assembly { a := func }
我無法理解你的意思。
在solidity中它們不存在函式指針,因為呼叫機制是將控制權傳遞給擁有函式的智能合約,並使用ABI表跳轉到函式第一條指令。
所以沒有一個指向函式的指針,你可以像在 C 中那樣使用!
在 Solidity 中,任何函式的地址都是其智能合約的乙太坊地址
即定性地,*地址(函式 foo())*是實現 foo() 的智能合約的地址
可能是我沒有正確理解你的問題!
評論後編輯
類型轉換不能應用於函式類型,據我所知只能進行隱式轉換,這證明了作為左值的函式指針不存在。
“外部函式類型的值可以顯式轉換為地址,從而得到函式合約的地址。
當且僅當函式類型 A 的參數類型相同、返回類型相同、內部/外部屬性相同且 A 的狀態可變性不比B. 特別是:
純函式可以轉換為視圖和非支付函式 視圖函式可以轉換為非支付函式 支付函式可以轉換為非支付函式
函式類型之間沒有其他轉換是可能的。"
無論如何,如果我們是來這裡學習的,所以我希望很快能從你那裡學到新的東西。
檢查也用作參數