String
如何將函式返回值儲存在變數中?
我想在 Oraclize 查詢中創建一個動態 JSONpath。為此,我編寫了一個將三個字元串 (_a = “json(http…”,_b = some variable ,_c = “)].Number”) 集中到一個的函式。呼叫函式並獲取集中字元串作為返回工作正常。我現在如何在 Oraclize 查詢中使用我的集中字元串作為變數?
function strConcat()public view returns (string){ bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); string memory abc = new string(_ba.length + _bb.length + _bc.length); bytes memory babc = bytes(abc); uint k = 0; for (uint i = 0; i < _ba.length; i++) babc[k++] = _ba[i]; for (i = 0; i < _bb.length; i++) babc[k++] = _bb[i]; for (i = 0; i < _bc.length; i++) babc[k++] = _bc[i]; return string(babc); }
現在我想在 Oraclize 查詢中引入函式返回來創建動態查詢:
function update() payable { newOraclizeQuery("Oraclize query was sent..."); oraclize_query('URL', **return** ); }
您正在正確連接字元串,您現在需要做的就是在需要的任何地方呼叫該函式:
function update() payable { newOraclizeQuery("Oraclize query was sent..."); oraclize_query('URL', strConcat()); }
但是請注意,Oraclize API 中的字元串 concat 輔助函式也稱為
strConcat
,您的函式名稱會隱藏它。為了解決這個問題,我會編寫一個不同命名的函式。
工作範例:
這是 Oraclize 範例之一的重新調整的工作版本,向您展示了該方法的使用:
pragma solidity ^0.5.0; import "github.com/oraclize/ethereum-api/oraclizeAPI.sol"; contract DieselPrice is usingOraclize { uint public dieselPriceUSD; event LogNewDieselPrice(string price); event LogNewOraclizeQuery(string description); function __callback(bytes32 myid, string memory result) public { require(msg.sender == oraclize_cbAddress()); emit LogNewDieselPrice(result); dieselPriceUSD = parseInt(result, 2); // Let's save it as cents... // Now do something with the USD Diesel price... } function getQueryString() public pure returns (string memory) { string memory x = "xml(https://www.fueleconomy.gov/ws/rest/fuelprices)."; string memory y = "fuelPrices.diesel"; return strConcat(x,y); } function update() public payable { emit LogNewOraclizeQuery("Oraclize query was sent, standing by for the answer..."); oraclize_query("URL", getQueryString()); } }
將上述程式碼粘貼到Remix IDE中,使用任何高於該版本的編譯器進行編譯
0.5.0
並部署合約。瀏覽到設置選項卡並啟動 Oraclize 外掛,然後update
在部署合約後點擊執行選項卡中的功能。
當然,有很多方法可以實現與我上面相同的事情 - 例如,您還可以將連接函式的返回設置為變數,然後改用它
oraclize_query(...)
。隨意選擇對您最有意義的方法!