On 30/07/2021 18:24, Kirill Nesmeyanov wrote:
> enum ErrorGroup: int
> {
> case NOTICE = 0;
> case WARNING = 10;
> case ERROR = 20;
> }
>
> enum ErrorCode: int
> {
> case UNKNOWN = 0;
>
> case A = ErrorGroup::NOTICE + 1;
> case B = ErrorGroup::NOTICE + 2;
> case С = ErrorGroup::NOTICE + 3;
> case D = ErrorGroup::WARNING + 1;
> case E = ErrorGroup::ERROR + 1;
> }
As I say, those are not enums in the way the current feature defines "enum".
An enum, as implemented in the current 8.1 alphas, is not just a special
kind of constant, even if it has an integer or string associated. Every
enum is its own type (essentially a class), and every value is a
distinct value of that type (essentially an instance), which compares
equal only to itself.
var_dump(ErrorGroup::WARNING); // enum(ErrorGroup::WARNING);
var_dump(ErrorGroup::WARNING == 10); // bool(false)
var_dump(get_class(ErrorGroup::WARNING)); // string(10) "ErrorGroup"
There are languages where enums are just fancy names for integers, and
you can write things like "if ( ErrorCode::D >= ErrorGroup::WARNING )".
In my opinion, that makes enums much less useful, because it means you
can also write nonsensical things like "if ( Month::JANUARY <=
Day::WEDNESDAY )".
If you want to pass around an integer, but have a convenient name for
it, you can still use a class constant. The main value of native enums,
in my opinion, is being able to write strongly typed code saying "this
accepts a value of type ErrorGroup, and nothing else".
Regards,
--
Rowan Tommins
[IMSoP]