دستور Enums در برنامه نویسی سالیدیتی solidity
دستور Enums در سالیدیتی چیست؟
دستور Enums در برنامه نویسی سالیدیتی (solidity enums) که کوتاه شده واژه انگلیسی Enumerable به معنای قابل شمارش است، در واقع محدودکننده متغیر برای تنها یکی از چند مقدار از پیش تعریف شده است. این واژه را در فارسی قابل شمارش معنی میکنند و در این مورد به مقادیری ثابت که در این دستور برای متغیرها لیست میشود، enums گفته میشود.
اگر در برنامهنویسی سالیدیتی به یک لیست مقادیر از پیش تعریف شده که میتوانند دادههایی بر حسب عدد یا حروف باشند نیاز داشته باشید، لازم است از دستور Enum استفاده کنید. این مقادیر از پیش تعریف شده Enum در قراردادهای هوشمند Solidity در واقع به ساده شدن حفظ و خواندن قرارداد کمک زیادی میکنند و موجب کم کردن باگهای موجود در کد میشوند.
Enum ها به ویژه زمانی مفید هستند که ما نیاز به تعیین وضعیت یا جریان فعلی یک قرارداد هوشمند داریم. در این روش کاربر با ایجاد انواع دادههای از پیش تعریف شده، متغیر را محدود میکند. این دادههای از پیش تعریف شده یا مقادیر لیست شمارش شده که در واقع همان enums هستند موجب افزایش خوانایی کد میشوند.
به عنوان مثال با داشتن یک لیست از پیش تعریف شده و قابل خواندن که مقادیر بازگشتی آن 0،1،2،3،4 هستند دیگر امکان ارسال 5،10،15 و دیگر اعداد خارج از 0 تا 4 از بین میرود و احتمال به وجود آمدن اشکال در کد شما کم خواهد شد. با این مقاله در توکن خان همراه باشید تا با نمونههایی از دستور Enums در برنامه نویسی سالیدیتی آشنا شوید.
قبل از مطالعه کامل مقاله “دستور Enums در سالیدیتی Solidity” پشنهاد میکنیم مقالات دیگر دوره آموزش زبان سالیدیتی را هم مطالعه کنید.
Mapping در قرارداد هوشمند Solidity
تابع بازگشتی Fallback Function در سالیدیتی
توسعه قرارداد هوشمند در محیط ریمیکس Remix
توابع modifiers در سالیدیتی solidity
حلقه های تکرار در سالیدیتی Solidity Loop
رویدادها Events در برنامه نویسی Solidity
چند مثال برای دستور Enum در سالیدیتی
به عنوان نمونه میتوان در ایجاد یک قرارداد هوشمند حمل و نقل، مقادیری از پیش تعریف شده ایجاد کرد که موجب آسانتر شدن پیگیری سفارشات شود. این لیست مقادیر یک دستور Enum است که وضعیت نامیده میشود و تنها میتواند دارای حالتها و مقادیر زیر باشد.
- در حال انتظار Pending
- ارسال شد Shipped
- پذیرفته شد Accepted
- رد شد Rejected
- لغو شد Canceled
در تصویر زیر میتوانید نمونه این قرارداد را مشاهده کنید که یک شماره با نام وضعیت Enum status دارد و چند مقدار برای آن از پیش تعریف شده است. این قرارداد همچنین یک تابع دیگر دارد که یک متغیر را فراخوانی میکند تا متغیر با وضعیت در حال انتظار را به متغیر با وضعیت ارسال شد تغییر دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Contract Order { Enum status { Pending, Shipped, Accepted, Rejected, Canceled } //take the enum status, make its visibility public and call it status. The first item in the enum is the default (pending would be the default - 0). Status public status; //function on how to update the status to shipped if the current status is pending Function ship() public { //the status has to equal pending. If it does change it to shipped Require(status ==Status.Pending); Status = Status.Shipped; } |
یک مثال سادهتر را میتوان در برنامهای برای یک آبمیوه فروشی در نظر بگیریم به این ترتیب که با مقادیر از پیش تعریف شده کوچک، متوسط و بزرگ برای اندازه لیوان آبمیوه این متغیر را محدود کنیم. به این ترتیب هیچ کس نمیتواند اندازههایی به جز این مقادیر از پیش تعریف شده را سفارش دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
pragma solidity ^0.5.0; contract test { enum FreshJuiceSize{ SMALL, MEDIUM, LARGE } FreshJuiceSize choice; FreshJuiceSize constant defaultChoice = FreshJuiceSize.MEDIUM; function setLarge() public { choice = FreshJuiceSize.LARGE; } function getChoice() public view returns (FreshJuiceSize) { return choice; } function getDefaultChoice() public pure returns (uint) { return uint(defaultChoice); } } |
این نکته را در نظر داشته باشید که شما نیازی ندارید تا اعلان enum را با نقطه ویرگول ; خاتمه دهید. کامپایلر از نقطه ویرگول ; و {} استفاده میکند تا محدوده کدی که روی آن اعمال میشود را تعیین کند.
Syntax دستور Enums در برنامه نویسی سالیدیتی
سینتکس یا همان نحوه نگارش و قرارگیری کلمات و عبارات به صورت صحیح در زبان برنامهنویسی برای دستور Enum را میتوانید در تصویر زیر مشاهده کنید.
1 2 3 |
enum <enumerator_name> { element 1, element 2,....,element n } |
چه کارهایی را با دستور Enums در برنامه نویسی سالیدیتی نمی توان انجام داد؟
برخی از کارها را با این دستور در سالیدیتی نمیتوان اجرا کرد که شامل موارد زیر است:
- تبدیل انواع دادهها به صورت ضمنی در این دستور مجاز نیست.
- از اعداد و بولینها به عنوان مقادیر از پیش تعریف شده در لیست enum نمیتوان استفاده کرد. (در برنامههای کامپیوتری ، سه نوع داده وجود دارد: متن ، اعداد و بولین. نوع داده بولین مقداری است که فقط میتواند درست یا غلط باشد.)
- Enumها را به عنوان یک نوع کلید در نقشهبرداری نمیتوان استفاده کرد.
- Enumها بخشی از یک رابط باینری برنامه (ABI) نیستند در نتیجه نمیتوان آنها را در یک تابع برگرداند.
- برای تعریف دستور Enums در یک رابط باید حتما نسخه کامپایلر سالیدیتی شما 0.5.0 و بالاتر باشد.
سخن آخر
در برنامهنویسی سالیدیتی enums کوتاه شده واژه Enumerable به معنای قابل شمارش است و به انواعی از دادهها اطلاق میشود که کاربر توسط آن متغیرها را محدود میکند. به این ترتیب که متغیر تنها میتواند یکی از مقادیری که از پیش برای آن تعریف میشود را داشته باشد. به این مقادیر که از پیش توسط کاربر تعریف میشود و در لیست شمارش شده قرار میگیرند، enums میگویند و این دستور Enums در برنامه نویسی سالیدیتی است.
در داخل برنامه، enum ها به عنوان اعداد در نظر گرفته میشوند و Solidity به طور خودکار enum ها را به اعداد صحیح بدون علامت تبدیل میکند. یک Enum در قراردادهای هوشمند Solidity باید حداقل یک مقدار یا یک عضو در لیست شمارش شده داشته باشد تا تعریف شود، با این حال، آنها برای تعریف یک سری مقادیر از پیش تعریف شده (یا خارج از مجموعه کوچکی از مقادیر ممکن) مفید هستند. این مقدار و اعضای یک enum نمیتواند یک عدد (مثبت یا منفی) یا یک مقدار بولی (درست یا نادرست با حروف کوچک) باشد. با این حال، درست و نادرست (با حروف بزرگ) پذیرفته شده است.
منابع معتبر مرتبط:
https://www.geeksforgeeks.org/solidity-enums-and-structs
https://jeancvllr.medium.com/solidity-tutorial-all-about-enums
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
توابع Payable در قراردادهای هوشمند Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
توابع Function در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
7 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
احسنت عالی بود
بازم درمورد این موضوع مطلب بزارین
این مطلب حرف نداشت
مثل همیشه عالی و کاربردی
چطوری می تونم باهاتون ارتباط بر قرار کنم؟
خیلی دنبال این موضوع بودم
حرف نداشت👌🏻