حلقه های تکرار در سالیدیتی Solidity Loop
حلقه های تکرار Solidity Loop در سالیدیتی چیست؟
حلقه های تکرار در سالیدیتی solidity loops دستوراتی هستند که برای جلوگیری از تکرار چندباره یک عمل در زمان نوشتن یک قرارداد کاربرد دارند. با نوشتن دستورات حلقه در سالیدیتی تعداد خطوط در برنامهنویسی تا حد قابل قبولی کاهش مییابد. تعدادی از این حلقه های تکرار در solidity که در موارد سادهتر گاهی به جای یکدیگر هم قابل استفاده هستند حلقههای for، while و do…while هستند. این حلقهها را میتوان در مواردی مشابه استفاده کرد و انتخاب دستور تا حد زیادی به دلخواه کاربر بستگی دارد. مواردی مانند سهولت در به خاطر سپردن دستور در این انتخاب تاثیرگذار خواهد بود.
به بیان دیگر کاربرد این حلقه های تکرار در solidity چندبار اجرای یک قطعه کد است و استفاده از آنها برای کم کردن فشار در برنامهنویسی به برنامهنویسان سالیدیتی برای اجرای قراردادهای هوشمند در بلاک چین اتریوم کمک بسیار زیادی میکند. در این مقاله توکن خان قصد داریم تا اطلاعات بیشتری در مورد کاربرد تعدادی از این حلقه های تکرار در سالیدیتی با شما در میان بگذاریم پس با ما همراه باشید.
قبل از مطالعه کامل مقاله “حلقه های تکرار در سالیدیتی Solidity” پشنهاد میکنیم مقالات دیگر حوزه آموزش زبان سالیدیتی را هم مطالعه کنید.
Mapping در قرارداد هوشمند Solidity
تابع بازگشتی Fallback Function در سالیدیتی
توسعه قرارداد هوشمند در محیط ریمیکس Remix
توابع modifiers در سالیدیتی solidity
دستور Enums در برنامه نویسی سالیدیتی
رویدادها Events در برنامه نویسی Solidity
حلقه تکرار For در قرارداد هوشمند Solidity
یکی از حلقه های تکرار در سالیدیتی که به عنوان پرکاربردترین و شناخته شدهترین آنها از آن یاد میشود، حلقه for است. ساختار کلی یک حلقه for یا سینتکس آن به شرح زیر است:
1 2 3 |
for (initialize loop counter; check and test the counter; increase the value of counter;) { Execute multiple instructions here } |
کلمه کلیدی For یک کلمه کلیدی در سالیدیتی است که به کامپایلر اطلاع میدهد که این دستور اطلاعاتی در خصوص حلقه کردن مجموعهای از دستورات را در خود دارد. در واقع حلقه For در سالیدیتی به منظور تکرار اجرای یک حلقه برای n بار کاربرد دارد و n تعداد دفعاتی است که کاربر به تابع ارسال میکند.
این حلقه در بین حلقه های تکرار در solidity یکی از فشردهترین اشکال حلقه زدن است و سه قسمت مهم دارد.
- loop initialization یا مقداردهی اولیه حلقه که در این قسمت شمارنده خود را مقداردهی اولیه میکنیم و دستور ابتدایی پیش از آغاز حلقه اجرا میشود.
- test statement یا اعلام تست که درست یا نادرست بودن شرط را مورد آزمون قرار میدهد و در صورتی که شرط درست باشد کد نوشته شده در داخل حلقه اجرا میشود. در صورتی که شرط نادرست باشد کنترل از حلقه خارج میشود.
- iteration statement یا اعلام تکرار که در این قسمت میتوان شمارنده را کم یا زیاد کرد.
این حلقه با یکی دیگر از حلقه های تکرار در solidity شباهت زیادی دارد و آن حلقه while است، اما نسبت به آن کوتاهتر و قابل خواندنتر است تا جایی که تمام اطلاعات در حلقه For در یک خط جای میگیرد و قابل مشاهده است. حال توضیح این حلقه در سالیدیتی را با یک مثال ادامه میدهیم.
1 2 3 4 5 |
uint public count Function nameLoop(uint n) public { For(uint i =0; i < n; i++ ) { Count +=1; //Execute this code in the brace. Increment the counter by 1 every time the for loop runs } |
برای درک بهتر این مثال بهتر است توضیحاتی درباره این کد در اختیار شما بگذاریم.
- متغیر محلی از صفر آغاز میشود.
- تا هر زمان که i < n باشد این کد نوشته شده اجرا میشود و به ازای هر تکرار، i را افزایش میدهیم.
- حال فرض میکنیم تعداد تکرار یا همان n را بر روی عدد 4 تنظیم کرده باشیم، پس در این صورت تابع از صفر تا 4 بار اجرا میشود. به این ترتیب که:
- در حالت 0<4 : تابع در پرانتز زیر دستور اجرا میشود، سپس i را افزایش میدهد.
- در حالت 1<4 : تابع در پرانتز زیر عبارت اجرا میشود، سپس i را افزایش میدهد.
- در حالت 2<4 : تابع در پرانتز زیر عبارت اجرا میشود، سپس i را افزایش میدهد.
- در حالت 3<4 : تابع در پرانتز زیر دستور اجرا میشود، سپس i را افزایش میدهد.
- در حالت 4 <4 چون این حالت موجود نیست بنابراین حلقه خاتمه پیدا میکند.
حلقه تکرار while در قرارداد هوشمند Solidity
یکی دیگر از حلقه های تکرار در سالیدیتی که به عنوان ابتداییترین آنها از آن یاد میشود، حلقه while است. ساختار کلی یک حلقه while یا سینتکس آن به شرح زیر است:
سینتکس حلقه While
1 2 3 4 5 |
Declare and initialize a counter while (check the value of counter using an expression or condition) { Execute the instructions here Increment the value of counter } |
کلمه کلیدی while یک کلمه کلیدی در سالیدیتی است که به کامپایلر اطلاع میدهد که این دستور حاوی یک دستورالعمل در مورد کنترل تصمیم است. اگر این عبارت درست ارزیابی شود، دستورات کدی که در { } دنبال میشوند باید اجرا شوند. حلقه while تا زمانی که شرط نادرست شود، اجرا میشود. به بیان دیگر solidity while loops به منظور اجرای چندباره یک دستور به کار میرود و این اجرا تا هر زمان که عبارت درست باشد ادامه دارد و اگر عبارت نادرست شود خاتمه پیدا میکند.
نمودار حلقه تکرار While
این حلقه در سالیدیتی اول شرط را مورد بررسی قرار میدهد و درستی آن را تایید میکند سپس اگر شرط درستی عبارت برقرار باشد آن را وارد حلقه تکرار میکند. این حلقه های تکرار در solidity در مواردی که ابتدا و انتهای قرارداد یا برنامه نوشته شده نامشخص است و نیاز به تکرار یک عمل وجود دارد کاربرد دارد و بسیار مناسب عمل میکند. حال توضیح این حلقه در سالیدیتی را با یک مثال ادامه میدهیم، در این مثال قرارداد اجرای حلقه while و چگونگی تنظیم اولین آرایه توسط آن آورده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Solidity program to // demonstrate the use // of 'While loop' pragma solidity ^0.5.0; // Creating a contract contract Types { // Declaring a dynamic array uint[] data; // Declaring state variable uint8 j = 0; // Defining a function to // demonstrate While loop' function loop( ) public returns(uint[] memory){ while(j < 5) { j++; data.push(j); } return data; } } |
حلقه تکرار Do-While در قرارداد هوشمند Solidity
یکی دیگر از حلقه های تکرار در سالیدیتی که به حلقه قبلی یعنی while بسیار شبیه است، حلقه Do-While است. تفاوت اساسی بین این دو حلقه تکرار، در بررسی شرط در پایان حلقه برای حلقه Do-While است که به این معنی است که حلقه در تمام موارد حداقل یکبار اجرا میشود حتی اگر شرط نادرست باشد. ساختار کلی یک حلقه Do-While یا سینتکس آن به شرح زیر است:
سینتکس حلقه Do-While
1 2 3 4 5 |
Declare and Initialize a counter do { Execute the instructions here Increment the value of counter } while(check the value of counter using an expression or condition) |
همانطور که گفته شد تفاوت ظریفی بین دو حلقه تکرار while و Do While in solidity وجود دارد که زمان ارزیابی شرط است در نتیجه اگر میخواهید دستورالعملها را حداقل یک بار اجرا کنید باید حلقه Do-While را انتخاب کنید.
نمودار حلقه تکرار Do-While
این حلقه در سالیدیتی اول یکبار دستورالعمل را اجرا میکند و سپس شرط را مورد بررسی قرار میدهد اگر شرط درستی عبارت برقرار باشد سپس آن را وارد حلقه تکرار میکند. حال توضیح این حلقه در سالیدیتی را با یک مثال ادامه میدهیم، در این مثال قرارداد اجرای حلقه do-while و چگونگی مقداردهی اولیه یک آرایه توسط آن آورده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Solidity program to // demonstrate the use of // 'Do-While loop' pragma solidity ^0.5.0; // Creating a contract contract Types { // Declaring a dynamic array uint[] data; // Declaring state variable uint8 j = 0; // Defining function to demonstrate // 'Do-While loop' function loop( ) public returns(uint[] memory){ do{ j++; data.push(j); }while(j < 5) ; return data; } } |
کاربرد دستورات break و continue در سالیدیتی چیست؟
زبان برنامهنویسی سالیدیتی کنترل کاملی برای مدیریت حلقههای تکرار و سوئیچ اعلامها را فراهم کرده است، مثلا در شرایطی شاید نیاز داشته باشید تا از یک حلقه خارج شوید بدون اینکه به انتهای آن برسید. یا در شرایطی باشید که بخواهید بخشی از بلاک کد خود را رد کنید و تکرار حلقه بعدی را شروع کنید. سالیدیتی برای مدیریت این شرایط دو اعلام break و continue را ارائه میدهد. به این صورت که از اعلام break برای خروج فوری از هر حلقه و از اعلام continue برای شروع تکرار حلقه بعدی استفاده میشود.
نمودار break
مثال زیر استفاده از دستور break با حلقه while را نشان میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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); } } |
مثال زیر استفاده از اعلام continue با حلقه while را نشان میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
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); } } |
سخن آخر
زبان برنامهنویسی سالیدیتی از حلقههای تکرار for , while و do while پشتیبانی میکند تا فشار برنامهنویسی را کم کند. اما گفته میشود که چون با نوشتن حلقههای بیکران (unbounded) مانند حلقههای while و do while ممکن است به حد گس برسد و تراکنش شکست بخورد به ندرت از این دو حلقه در سالیدیتی استفاده میشود.
منابع معتبر مرتبط:
https://www.geeksforgeeks.org/solidity-while-do-while-and-for-loop
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
توابع Function در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
7 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
مطلب خوبی بود
خیلی محتوای کامل و عالی بود
خیلی محتوای خوبی بود مهندس
واقعا ارزش وقت گذاشتن داشت
احسنت عالی بود
مطلب خوبی بود همکار گرامی
مطلب به درد بخوری بود