String

如何將函式返回值儲存在變數中?

  • December 21, 2018

我想在 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(...)。隨意選擇對您最有意義的方法!

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