Solidity-loop-control

提供:Dev Guides
移動先:案内検索

堅牢性-ループ制御

Solidityは、ループの処理とステートメントの切り替えを完全に制御します。 ループの底に達することなくループから抜け出す必要がある場合があります。 また、コードブロックの一部をスキップして、ループの次の反復を開始する場合もあります。

このような状況をすべて処理するために、Solidityは break および continue ステートメントを提供しています。 これらのステートメントは、ループから即座に抜け出すため、またはループの次の反復を開始するためにそれぞれ使用されます。

breakステートメント

_switch_ステートメントで簡単に導入された break ステートメントは、ループを早期に終了し、中括弧から抜け出すために使用されます。

フローチャート

breakステートメントのフローチャートは次のようになります-

ブレイクステートメント

次の例は、whileループでの break ステートメントの使用を示しています。

pragma solidity ^0.5.0;

contract SolidityTest {
   uint storedData;
   constructor() public{
      storedData = 10;
   }
   function getResult() public view returns(string memory){
      uint a = 1;
      uint b = 2;
      uint result = a + b;
      return integerToString(result);
   }
   function integerToString(uint _i) internal pure
      returns (string memory) {

      if (_i == 0) {
         return "0";
      }
      uint j = _i;
      uint len;

      while (true) {
         len++;
         j/= 10;
         if(j==0){
            break;  //using break statement
         }
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;

      while (_i != 0) {
         bstr[k--] = byte(uint8(48 + _i % 10));
         _i/= 10;
      }
      return string(bstr);
   }
}

link:/solidity/solidity_first_application [Solidity First Application]の章に記載されている手順を使用して、上記のプログラムを実行します。

出力

0: string: 3

continueステートメント

*continue* ステートメントは、ループの次の反復をすぐに開始し、残りのコードブロックをスキップするようにインタープリターに指示します。 *continue* ステートメントが検出されると、プログラムフローはすぐにループチェック式に移動し、条件が真のままであれば次の反復を開始し、そうでない場合は制御がループから抜け出します。

この例は、whileループでの continue ステートメントの使用を示しています。

pragma solidity ^0.5.0;

contract SolidityTest {
   uint storedData;
   constructor() public{
      storedData = 10;
   }
   function getResult() public view returns(string memory){
      uint n = 1;
      uint sum = 0;

      while( n < 10){
         n++;
         if(n == 5){
            continue;//skip n in sum when it is 5.
         }
         sum = sum + n;
      }
      return integerToString(sum);
   }
   function integerToString(uint _i) internal pure
      returns (string memory) {

      if (_i == 0) {
         return "0";
      }
      uint j = _i;
      uint len;

      while (true) {
         len++;
         j/= 10;
         if(j==0){
            break;  //using break statement
         }
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;

      while (_i != 0) {
         bstr[k--] = byte(uint8(48 + _i % 10));
         _i/= 10;
      }
      return string(bstr);
   }
}

link:/solidity/solidity_first_application [Solidity First Application]の章に記載されている手順を使用して、上記のプログラムを実行します。

出力

0: string: 49