Re: [RFC] Enumerations, Round 2

From: Date: Sun, 03 Jan 2021 11:10:48 +0000
Subject: Re: [RFC] Enumerations, Round 2
References: 1 2 3 4  Groups: php.internals 
Request: Send a blank email to internals+get-112725@lists.php.net to get a copy of this message

On 03.01.21 11:56, Marc wrote:
> On 29.12.20 16:42, Larry Garfield wrote:
>> On Tue, Dec 29, 2020, at 2:48 AM, Marc wrote:
>>> On 28.12.20 21:21, Larry Garfield wrote:
>>>> Hello, Internalians!
>>>>
>>>> After considerable discussion and effort, Ilija and I are ready to offer you round
>>>> 2 on enumerations.  This is in the spirit of the previous discussion, but based on that discussion a
>>>> great deal has been reworked.  The main change is that Enumeration Cases are now object instances of
>>>> the Enumeration class rather than their own class.  Most of the other changes are knock-on effects
>>>> of that.
>>>>
>>>> Of particular note:
>>>>
>>>> * Cases may not have methods or constants on them.  They're just dumb values.
>>>> * Enums themselves may have methods, static methods, or constants.
>>>> * Traits are supported, as long as they don't have properties.
>>>> * The value() method on scalar enums is now a property.
>>>>
>>>> The full RFC is here, and I recommend reading it again in full given how much was
>>>> updated.
>>> I did and the RFC looks really awesome :+1:
>>>
>>> I don't have time to test the implementation but I noticed one thing:
>>>
>>>> If the enumeration is not a Scalar Enum, the array will be packed
>>> (indexed sequentially starting from 0). If the enumeration is a Scalar
>>> Enum, the keys will be the corresponding scalar for each enumeration.
>>>
>>> I don't think using the scalar values as keys is a good idea. What
>>> happens if we want to support scalar float values? (Why are they
>>> actually not supported in the first place?)
>> That's why floats are not supported, in fact, because what happens to them when they
>> are made into an array key is non-obvious.  (PHP would say to convert to a string, but that's
>> always fussy with possible data loss in some cases, etc.)  We decided to just avoid that problem
>> until/unless someone found a good use case for float enums.  No all languages support them as is, so
>> there is precedent.
>>
>>> Also I think it's more natural if both enum types return a
>>> zero-indexed-array of cases.
>> The goal is to make it easy to work with them, and having a clean lookup map readily
>> available is very convenient.  If you don't care about the scalar equivalent then you can
>> safely ignore them.  If you do want them, then you have a lookup table ready-made for you. 
>> That's the logic we were working from.
> I don't have a really good use-case for float values. It just seems
> weird to me that a ScalarEnum doesn't support all scalars.
>
> Using the enum value as array key for cases() works with your current
> proposal but if we later want to allow floats, bool whatever then we got
> a food gun.

Forgot to mention on (virtiually) adding generics to the game the method
cases(): array;<http://www.php.net/array>would be described as
cases(): array<int, static>; on UnitEnum but `cases():
array<string|int, static>;` on ScalarEnum which is not compatible for
reasons and I think (even if not yet possible with PHP) such things
needs to be considered on producing clean interfaces.


>
> You already provide a lookup mechanism with MyEnum::from() - I don't
> see a real use-case for proving a pre build map. The main use case I see
> is to list all possible enum values but this doesn't require a map and a
> zero-indexed-array would also be more performant with packed arrays
> (correct me if I'm wrong).
>

Thanks,

Marc


>> --Larry Garfield
>>


Thread (52 messages)

« previous php.internals (#112725) next »