Типізовані перерахування
За замовчуванням варіанти перерахувань не мають скалярного еквівалента. Це звичайні одноелементні об'єкти. Однак існують випадки, коли варіантам перерахувань потрібно звертатися до бази даних або аналогічного сховища даних, тому корисно мати вбудований скалярний (і, отже, тривіально серіалізується) еквівалент, визначений внутрішньо.
Щоб визначити скалярний еквівалент для перерахувань, користуються наступним синтаксисом:
Loading...
Варіант зі скалярним еквівалентом називається типізованим (Backed Case), оскільки він "підтриманий" більш простим значенням. Перелік, у якого всі варіанти типізовані, називається типизованим перерахуванням (Backed Enum). Типізований перелік може містити лише типізовані варіанти. Чисте перерахування може містити лише чисті варіанти.
Типізований перелік може підтримуватись типами int
илиstring
і такий перелік підтримує лише один тип за раз (тобто не можна об'єднувати int|string
). Якщо перелік позначений як той, що має скалярний еквівалент, тоді всі варіанти повинні мати певний явно унікальний скалярний еквівалент. Не існує скалярних еквівалентів, що автоматично генеруються (наприклад, послідовних цілих чисел). Типізовані варіанти мають бути унікальними; двом варіантам типізованого перерахування не може належати той самий скалярний еквівалент. Однак константа може належати до варіанта, фактично створюючи псевдонім. Дивіться « Константи перерахувань ».
Еквівалентні значення мають бути рядками або рядковими виразами. Константи та постійні вирази не підтримуються. Тобто 1 + 1
разрешено, а1 + SOME_CONST
- Ні.
Типизовані варіанти мають додаткову доступну тільки для читання властивість value
- Це значення, задане у визначенні варіанта.
Loading...
Щоб властивість value
залишалося доступним тільки для читання, було заборонено призначати змінну як посилання на неї. Тобто наступний код видасть помилку:
Loading...
Типізовані перерахування реалізують внутрішній інтерфейс BackedEnum, який дає два додаткові методи:
from(int|string): self
візьме скаляр і поверне варіант перерахування, якому належить. Якщо варіант, який відповідає варіанту перерахування, не знайдено, метод викине винятокValueError. Це переважно корисно тоді, коли вхідний скаляр надійний, а відсутність значення перерахування треба як помилку, зупиняє додаток.tryFrom(int|string): ?self
візьме скаляр і поверне варіант перерахування, якому належить. Якщо варіант, який відповідає варіанту перерахування, не знайдено, метод повернеnull
. Це в основному корисно тоді, коли вхідний скаляр ненадійний і функція, що викликає, хоче реалізувати свою обробку помилок або логіку значення за умовчанням.
Методи from()
иtryFrom()
дотримуються стандартних правил слабкої/суворої типізації. У режимі слабкої типізації допустима передача цілого числа або рядка, система перетворює значення і знайде варіант, який відповідає. Передача числа з плаваючою точкою також працюватиме з примусовим перетворенням. У режимі суворої типізації передача цілого числа метод from()
у перерахунку з рядковою типізацією (або навпаки) у будь-якому випадку призведе до виключення TypeError, як і передачі числа з плаваючою точкою. Всі інші типи параметрів викинуть виняток TypeError в обох режимах.
Loading...
Ручное определение методаfrom()
илиtryFrom()
у типізованих переліках призведе до фатальної помилки.