آرایه ها (Array) در قرارداد هوشمند زبان برنامه نویسی Solidity
آرایه ها Array در زبان برنامه نویسی Solidity
آرایه ها در سالیدیتی solidity arrays ساختارهای دادهای هستند که مجموعهای از عناصر از انواع داده مشابه را ذخیره میکنند که تک تک عناصر یک مکان ویژه دارند که این مکان ویژه، شاخص (index) نامیده میشود.
ما این امکان را داریم که به جای ایجاد متغیرهای مستقل متعدد از نوع یکسان، تنها یک آرایه (Array) از اندازه مناسب اعلان کنیم و عناصر را در این آرایه ذخیره کنیم. سپس از طریق index میتوانیم به آنها دسترسی داشته باشیم.
در زبان برنامه نویسی سالیدیتی یک آرایه میتواند دارای اندازه ثابت باشد یا اندازهای پویا داشته باشد. آرایهها یک مکان حافظه پیوسته دارند به صورتی که کمترین شاخص با اولین عنصر مطابقت دارد در حالی که بیشترین شاخص نمایانگر آخرین عنصر است. برای اینکه بیشتر با این مفهوم و کاربرد آن در سالیدیتی آشنا شوید با ما در توکن خان همراه باشید.
قبل از مطالعه کامل مقاله “آرایه ها Array در زبان سالیدیتی Solidity” پیشنهاد میکنیم مقالات دیگر حوزه آموزش زبان سالیدیتی را هم مطالعه کنید.
عملگرها در برنامه نویسی سالیدیتی
Struct در قراردادهای هوشمند سالیدیتی Solidity
Interface در قراردادهای هوشمند Solidity
وراثت در سالیدیتی Solidity Inheritance
Mapping در قرارداد هوشمند Solidity
کاربردهای برنامه نویسی سالیدیتی
آرایه ها در سالیدیتی
آرایه ها در سالیدیتی Solidity بر اساس اندازه در دو نوع زیر طبقهبندی میشوند:
-
آرایه اندازه ثابت (Fixed Size Array)
در یک آرایه با اندازه ثابت در سالیدیتی، اندازه آرایه باید در هنگام اعلان مشخص شود و پس از اعلان، اندازه آرایه قابل تغییر نیست. هر تلاشی که برای ارجاع دادن فراتر از آخرین موقعیت آرایه انجام شود، منجر به خطا خواهد شد.
آرایه با اندازه ثابت را میتوان در حین اعلان و یا بعد از اعلان در تابع دیگری مانند آنچه در مثال زیر خواهید دید، مقداردهی اولیه کرد.
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 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract DemoContract { // Inline Initialization uint[3] public age = [8,15,32]; string[3] public name; uint[4] public flag; function initializeName() public { name = ["Sunny","Bob","Lilly"]; } function initializeFlag() public { flag[0] = 21; flag[1] = 34; flag[2] = 65; flag[3] = 12; } } |
-
آرایه پویا (Dynamic Array)
در یک آرایه پویا در سالیدیتی، اندازه آرایه در هنگام اعلان ذکر نمیشود و میتوان آن را در طول زمان اجرا تغییر داد به این دلیل که عناصر بیشتری در طول زمان اجرا به آرایه اضافه میشود.
در مثال زیر راههای مختلف برای اعلان یک آرایه پویا را مشاهده میکنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract DemoContract { // Dynamic Array uint[] public flag; // Dynamic Array with first 3 elements initialized uint[] public age = [8,15,32]; // Dynamic Array initialized with new keyword int[] public num = new int[](5); } |
آرایه ها در سالیدیتی Solidity بر اساس محل ذخیره آنها نیز در دو نوع زیر طبقهبندی میشوند:
-
آرایه ذخیره سازی (Storage Array)
آرایه ذخیره سازی به صورت دائمی در ذخیره سازی بلاک چین باقی میماند. آنها خارج از تابع اعلان شده اند ولی میتوانند توسط هر تابعی در داخل قرارداد قابل دسترس باشند. همچنین برای کارکردن با آرایههای ذخیره سازی شما نیاز دارید تا گس بپردازید. این آرایهها میتوانند هم اندازه ثابت داشته باشند و هم پویا باشند. دو مثال قبلی هر دو مربوط به آرایههای ذخیره سازی هستند.
-
آرایه حافظه (Memory Array)
آرایه حافظه در بلاک چین ذخیره سازی نمیشود و همانطور که از نامش مشخص است به صورت موقت در حافظه ذخیره میشود. این آرایهها در داخل تابع اعلان میشوند و دامنهشان تنها برای آن تابع داخلی است. این آرایهها با توجه به اینکه در بلاک چین ذخیره نمیشوند شامل هزینه گس نیز نمیشوند.
مثال زیر چگونگی مقداردهی اولیه آرایه با اندازه 2 را نشان میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract DemoContract { function initialize() public pure returns(uint) { uint[] memory val = new uint[](2); val[0] = 100; val[1] = 99; return (val[0] + val[1]); } } |
چگونگی ایجاد یک آرایه Array
برای ایجاد یا اعلان یک آرایه با اندازه ثابت در سالیدیتی، برنامهنویس باید نوع عناصر و تعداد عناصر مورد نیاز برای یک آرایه را به صورت زیر مشخص کند.
1 |
type arrayName [ arraySize ]; |
این آرایه را با نام یک آرایه تک بعدی یا single-dimension نامگذاری کرده اند. اندازه آرایه یا arraySize باید عددی ثابت بزرگتر از صفر باشد و نوع آن میتواند هر نوع داده معتبر در سالیدیتی باشد. به عنوان مثال برای اعلان یک آرایه با 10 عنصر از نوع uint، که تحت عنوان balance نامگذاری شده است، از عبارت زیر استفاده میکنیم:
1 |
uint balance[10]; |
برای اعلان یک آرایه با اندازه پویا در سالیدیتی، برنامهنویس به شکل زیر نوع عناصر را مشخص میکند.
1 |
type[] arrayName; |
مقداردهی اولیه آرایه ها
عناصر آرایه ها در سالیدیتی Solidity را میتوان یا یکی یکی و یا با استفاده از یک دستور واحد به صورت زیر مقداردهی اولیه کرد.
1 |
uint balance[3] = [1, 2, 3]; |
تعداد مقادیر داخل [ ] نمیتواند بیشتر از تعداد عناصری باشد که ما برای آرایه در داخل براکت اعلان میکنیم. در ادامه مثالی برای اختصاص یک عنصر واحد از آرایه را میبینید.
اگر اندازه آرایه یا همان تعداد عناصر را حذف کنید، یک آرایه به اندازه کافی بزرگ برای نگهداری مقداردهی اولیه ایجاد میشود. بنابراین اگر شما عبارت زیر را بنویسید، دقیقا آرایهای مشابه با آنچه که در مثال قبلی انجام دادید، ایجاد خواهد شد.
1 |
uint balance[] = [1, 2, 3]; |
ایجاد آرایه های حافظه پویا
آرایههای حافظه پویا با استفاده از کلمه کلیدی new ایجاد میشوند.
1 2 |
uint size = 3; uint balance[] = new uint[](size); |
دسترسی به عناصر آرایه
یک عنصر با شاخص گذاری نام آرایه قابل دسترسی است، این کار با قراردادن شاخص عنصر در داخل پرانتز بعد از نام آرایه انجام میشود. مانند مثال زیر:
1 |
uint salary = balance[2]; |
عبارت بالا، عنصر سوم را از آرایه خواهد گرفت و مقدار آن را با متغیر salary مطابقت میدهد.
اعضا (Members) در آرایه ها
اعضا در آرایهها به ترتیب زیر هستند:
- Length : طول به عنوان یک عضو در آرایه، شامل تعداد عناصر آنها است. طول آرایههای حافظه پس از ایجاد ثابت است. طول، اندازه آرایه را برمیگرداند و آن را میتوان برای تغییر دادن اندازه آرایه پویا از طریق تنظیم کردن آن، استفاده کرد.
- push: این عضو اجازه میدهد تا یک عنصر را در پایان به یک آرایه ذخیره سازی پویا اضافه کنیم و همینطور طول جدید آرایه را برمیگرداند.
مثال پایانی
در این مثال تمامی مفاهیم اعلان (declaration)، تخصیص (assignment) و دسترسی به آرایهها (accessing) استفاده شده است. شما میتوانید کد زیر را امتحان کنید تا به این نکته پی ببرید که آرایه ها در سالیدیتی Solidity چگونه کار میکنند.
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 |
pragma solidity ^0.5.0; contract test { function testArray() public pure{ uint len = 7; //dynamic array uint[] memory a = new uint[](7); //bytes is same as byte[] bytes memory b = new bytes(len); assert(a.length == 7); assert(b.length == len); //access array variable a[6] = 8; //test array variable assert(a[6] == 8); //static array uint[3] memory c = [uint(1) , 2, 3]; assert(c.length == 3); } } |
جمع بندی
آرایه ها در سالیدیتی Solidity یک ساختار داده است و مشابه با اغلب زبانهای برنامهنویسی است. ساختار دادهای که عناصر (به طور معمول از نوع یکسان) را در مکانهای حافظه به هم پیوسته نگهداری میکند. این برای ما سودمندتر است که مجموعهای از عناصر از نوع یکسان را در یک متغیر آرایه منفرد ذخیره کنیم تا اینکه یک متغیر را برای هر کدام از آنها اعلان کنیم. عنصر داخل آرایه میتواند از طریق یک شاخص (index) که موقعیت آن عنصر است، قابل دسترسی باشد. اولین عنصر آرایه در موقعیت 0 ذخیره میشود.
منابع معتبر مرتبط:
https://www.geeksforgeeks.org/solidity-arrays
https://medium.com/coinmonks/array-and-map-in-solidity-a579b311d74b
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
توابع Function در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
8 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
مطلب به درد بخوری بود
مطلب بی نظیری بود
منابع این مطلب کجاست؟
مطلبتون بسیار مفید بود
مقالاتتون عالین واقعا!
خیلی محتوای کامل و عالی بود
خیلی دنبال این موضوع بودم
مثل همیشه عالی و کاربردی