آموزش آرایه ها در فضای ذخیره سازی در سالیدیتی
ممکن است در بخش مربوط به آرایه ها متوجه شده باشید که سه مورد عمداً ذکر نشدهاند:
-
نوشتن روی یک ایندکس خاص در آرایه
-
افزودن مقدار به انتهای آرایه (append)
-
حذف مقدار از انتهای آرایه (pop)
دلیل این امر آن است که این عملیات ها بهندرت روی آرایه هایی انجام میشوند که بهعنوان ورودی به توابع ارسال شده اند (مانند calldata
). اما زمانیکه آرایه ها بهصورت متغیرهای ذخیره سازی (storage) تعریف شده باشند، انجام این عملیات ها رایجتر است.
در اینجا چند کد برای مثال آورده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
contract ExampleContract { uint256[] public myArray; function setMyArray(uint256[] calldata newArray) public { myArray = newArray; } function addToArray(uint256 newItem) public { myArray.push(newItem); } function removeFromArray() public { myArray.pop(); } function getLength() public view returns (uint256) { return myArray.length; } function getEntireArray() public view returns (uint256[] memory) { return myArray; } } |
پیشنهاد میشود این کد را در محیط Remix کپی و اجرا کنید تا درک بهتری از نحوه عملکرد آن بهدست آورید.
برای مثال، اگر تابع setMyArray
را با آرایه [1,2,3,4,5,6]
فراخوانی کنید و سپس تابع getLength()
را اجرا نمایید، مقدار ۶ را دریافت خواهید کرد. حال اگر تابع addToArray
را با مقدار ورودی ۱۰ فراخوانی کنید و مجدد getLength()
را اجرا نمایید، خروجی برابر ۷ خواهد بود. با اجرای تابع removeFromArray()
یک عنصر از انتهای آرایه حذف میشود و طول آن مجدداً به ۶ کاهش مییابد.
نمایش خودکار آرایه در Remix
از آنجا که متغیر myArray
بهصورت public
تعریف شده است، کامپایلر بهصورت خودکار تابعی به همین نام ایجاد میکند که امکان مشاهده مقادیر آرایه از طریق ایندکس را فراهم میکند:
اما کل آرایه را برنمیگرداند. یک اندیس (index) را درخواست میکند و مقدار موجود در آن اندیس را برمیگرداند. تابع myArray به این صورت عمل میکند:
1 2 3 4 5 6 |
function myArray(uint256 index) public view returns (uint256) { return myArray[index]; } |
getEntireArray()
استفاده کنید.
نکته مهم دیگر این است که تابع pop()
فقط عنصر انتهایی را حذف میکند و مقداری بازنمیگرداند.
حذف یک عنصر خاص از آرایه در سالیدیتی
زبان Solidity بهصورت مستقیم امکان حذف یک عنصر از میانه آرایه همراه با کاهش طول آرایه را ندارد. اگر تابع زیر را اجرا کنید، مقدار عنصر مورد نظر برابر صفر خواهد شد، اما طول آرایه تغییر نخواهد کرد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
contract ExampleContract { uint256[] public myArray; function removeAt(uint256 index) public { delete myArray[index]; // sets the value at index to be zero // the following code is equivalent // myArray[index] = 0; // myArray.length does not change in either circumstance } } |
تکنیک Pop and Swap
برای حذف کامل یک عنصر و کاهش طول آرایه، باید از روش «Pop and Swap» استفاده کنید. این روش عنصر مورد نظر را با آخرین عنصر آرایه جایگزین کرده و سپس عنصر انتهایی را حذف میکند:
1 2 3 4 5 6 7 8 9 10 |
contract ExampleContract { uint256[] public myArray; function popAndSwap(uint256 index) public { uint256 valueAtTheEnd = myArray[myArray.length - 1]; myArray.pop(); // reduces the length; myArray[index] = valueAtTheEnd; } } |
توجه داشته باشید که این روش ترتیب عناصر در آرایه را حفظ نمیکند و فقط برای حذف سریع مفید است.
رشته ها (Strings) در سالیدیتی
رشته ها نیز مشابه آرایه ها رفتار میکنند، اما تفاوتهایی نیز دارند:
-
رشتههای
public
کل مقدار خود را بازمیگردانند، زیرا برخلاف آرایهها، قابلیت ایندکسگذاری ندارند. -
متدهایی مانند
pop()
وlength
برای رشتهها وجود ندارند.
مثال:
1 2 3 4 5 6 7 8 9 |
contract ExampleContract { string public name; function setName(string calldata newName) public { name = newName; } } |
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۱۰ اردیبهشت ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره آموزش Go
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس