Interesting, I would never expect Map.to_list/1 like functions guarantee
results in specific order especially if these maps are equal %{a: 1, b: 2},
%{b: 2, a: 1}.
In example you've given, we have numbers as string keys and the items order
after conversion to a list you expect is unclear given that strings sorted
differently than numbers ("9" > "100" => true).
> On 30 Oct 2022, at 00:27, Zach Daniel <[email protected]> wrote:
>
> The way that this can lead to bugs is when you dynamically build a map, and
> then later iterate over the keys and values in some way that depends on the
> order (which is the actual bug here) but you don't notice because the map has
> a stable sort. In this instance, we had code in AshPhoenix that was working
> with the params that come back from a Phoenix.HTML.FormData form, that looks
> like this:
>
> %{"0" ⇒ …, "1" ⇒ …., "2" ⇒ ….}
>
> And we then turn that into a structure like `[%{...}, %{...}, %{...}]` and we
> were not properly sorting. The test suite didn't ever use 10 or more
> elements, but when a user did, they saw their forms no longer coming back in
> the order they were in the HTML, but form 10 was after form 1, because the
> map was string key sorted. This is just one example, I've been bitten by this
> a few times. The actual problem is of course iterating over a map when the
> order matters, but the point is that by having a predictable, stable behavior
> below 32 elements, it increases the likelihood that a programmer wouldn't
> notice that they had done that.
>
> With that said, based on the value being baked into the VM as a C constant,
> its definitely not worth the effort to find some way to alleviate this issue
>
>
> On Sat, Oct 29, 2022 at 4:19 PM, Boris Kuznetsov <[email protected]
> <mailto:[email protected]>> wrote:
> Could someone please share an example when it can lead to bugs in a system
>
> To me maps are simple key/value data structure which gets accessed through
> direct work with a key or pattern matched against
>
>> On 28 Oct 2022, at 06:20, Zach Daniel <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> Myself and many other developers have been bitten by the fact that maps are
>> sorted if they have less than 33 elements. Not because we believed that we
>> should rely on the sort ordering of a map, but because we *accidentally*
>> wrote an implementation that did, and didn't test it with more than 32
>> elements. Then at some point later in actual use things get strange, and
>> debugging the above scenario can be very difficult (but is of course obvious
>> in retrospect). This could be opt-in or opt-out, all the same to me,
>> although unless the performance impacts are huge I think that it would save
>> new developers even more time than experienced developers and so should
>> potentially be opt-out. After a while when you start to see things "showing
>> up in weird orders" you have an intuition to go look for a map being
>> enumerated, but that isn't something a beginner would likely think of.
>>
>> As far as I know this is an erlang thing, but I'm not too familiar with
>> erlang and thought I'd float it by the elixir group first. I'm also not sure
>> if its possible to change those constants based on Mix environments (or to
>> change them at all), but I imagine that is where it will intersect with
>> Elixir.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected]
>> <mailto:[email protected]>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/elixir-lang-core/a528c1bb-b8e1-429c-b1ff-a98db36ee2d6n%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/elixir-lang-core/a528c1bb-b8e1-429c-b1ff-a98db36ee2d6n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected]
> <mailto:[email protected]>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/8C768E7E-61D7-4B69-956D-16567D2998DC%40achempion.com
>
> <https://groups.google.com/d/msgid/elixir-lang-core/8C768E7E-61D7-4B69-956D-16567D2998DC%40achempion.com?utm_medium=email&utm_source=footer>.
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected]
> <mailto:[email protected]>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/l9uhk9qo.38af49dc-4df8-4c53-8ff7-493fad67302b%40we.are.superhuman.com
>
> <https://groups.google.com/d/msgid/elixir-lang-core/l9uhk9qo.38af49dc-4df8-4c53-8ff7-493fad67302b%40we.are.superhuman.com?utm_medium=email&utm_source=footer>.
--
You received this message because you are subscribed to the Google Groups
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/elixir-lang-core/1021D9B7-68B5-469E-AAE4-71753FF85ADD%40achempion.com.