Solidity

如何在 Solidity 中對函式指針進行類型轉換?

  • March 13, 2019

我有一個接受類型參數的函式function (uint256) view returns (uint256)

我想向它傳遞一個指向類型函式的指針function (uint256) pure returns (uint256)

pure顯然,將這個函式傳遞給一個期望函式的參數應該沒有問題view,因為參數和返回類型是相同的,並且pureview. 但是,我得到了這個 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關鍵字處給出 ParserError

function(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() 的智能合約的地址

可能是我沒有正確理解你的問題!


評論後編輯

類型轉換不能應用於函式類型,據我所知只能進行隱式轉換,這證明了作為左值的函式指針不存在。

來自Solidity 文件:

“外部函式類型的值可以顯式轉換為地址,從而得到函式合約的地址。

當且僅當函式類型 A 的參數類型相同、返回類型相同、內部/外部屬性相同且 A 的狀態可變性不比B. 特別是:

純函式可以轉換為視圖和非支付函式 視圖函式可以轉換為非支付函式 支付函式可以轉換為非支付函式

函式類型之間沒有其他轉換是可能的。"

無論如何,如果我們是來這裡學習的,所以我希望很快能從你那裡學到新的東西。

檢查也用作參數

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