[#113435] [Ruby master Feature#19634] Pattern matching dynamic key — "baweaver (Brandon Weaver) via ruby-core" <ruby-core@...>
Issue #19634 has been reported by baweaver (Brandon Weaver).
6 messages
2023/05/09
[#113489] [Ruby master Bug#19642] Remove vectored read/write from `io.c`. — "ioquatix (Samuel Williams) via ruby-core" <ruby-core@...>
Issue #19642 has been reported by ioquatix (Samuel Williams).
10 messages
2023/05/15
[ruby-core:113532] Re: [Ruby master Feature#19634] Pattern matching dynamic key
From:
Austin Ziegler via ruby-core <ruby-core@...>
Date:
2023-05-19 15:59:03 UTC
List:
ruby-core #113532
I count 44 instances of this in our production code (~100k lines of
Elixir), but I don=E2=80=99t think I=E2=80=99ve ever used key and value pin=
ning as shown in
the examples above.
But dynamic key matching is precisely what is required when it is required,
although it=E2=80=99s rare enough.
Here's a sample GraphQL response parser or the Shopify Customers API:
```elixir
def parse_customer_response(%{} =3D body, resource, action) do
gql_action =3D resource <> String.capitalize(action)
case body do
%{status: 200, body: %{^gql_action =3D> %{^resource =3D> %{} =3D resu=
lt,
"userErrors" =3D> []}}} ->
{:ok, result}
%{status: 200, body: %{^gql_action =3D> %{"userErrors" =3D> []} =3D
result}} ->
{:ok, result}
%{errors: errors} ->
{:error, Enum.map(errors, &Map.get(&1, "message"))}
%{body: %{^gql_action =3D> %{"userErrors" =3D> errors}}} ->
{:error, Enum.map(errors, &Map.get(&1, "message"))}
%{body: %{^gql_action =3D> nil}} ->
{:error, [%{message: "#{gql_action} access denied"}]}
%{body: nil} ->
{:error, [%{message: "#{gql_action} access denied"}]}
_ ->
{:error, [%{message: "Unknown error"}]}
end
end
```
I haven=E2=80=99t started using pattern matching in Ruby, but I could see s=
ome
simplified code with dynamic key matching.
-a
On Thu, May 18, 2023 at 12:39=E2=80=AFAM marcandre (Marc-Andre Lafortune) v=
ia
ruby-core <ruby-core@ml.ruby-lang.org> wrote:
> Issue #19634 has been updated by marcandre (Marc-Andre Lafortune).
>
>
> Some actual examples of dynamic key matching in Elixir:
> https://github.com/search?q=3D%2F%25%5C%7B%5C%5E%2F+&type=3Dcode
>
> ----------------------------------------
> Feature #19634: Pattern matching dynamic key
> https://bugs.ruby-lang.org/issues/19634#change-103138
>
> * Author: baweaver (Brandon Weaver)
> * Status: Open
> * Priority: Normal
> ----------------------------------------
> I found myself in a situation ([stable marriage problem](
> https://rosettacode.org/wiki/Stable_marriage_problem#top-page)) where I
> would like to match against a dynamic key, like so:
>
> ```ruby
> mentor_proposals =3D { mentor_name: ['mentee_1', 'mentee_2'] }
> mentor_name =3D :mentor_name
> mentee_name =3D 'mentee_1'
>
> mentor_proposals in ^key: [*, ^mentee_name, *] # SyntaxError
> ```
>
> Currently this is not supported syntax, but there are some use cases in
> which I might see myself wanting to use it including this one. As
> `deconstruct_keys` currently accepts an `Array` of keys this would not
> break compatibility but would introduce syntactic complexity in capturing
> keys on hash-like matches.
>
> I believe the tradeoff is worthwhile, but would like to hear others
> opinions on the matter.
>
> Granted this case has some oddities of `Symbol` and `String`
> interchangeability as an implementation detail, and I will not be arguing
> for key irreverence in this issue as that's a [much more involved topic](
> https://dev.to/baweaver/the-case-for-pattern-matching-key-irreverence-in-=
ruby-1oll
> ).
>
>
>
> --
> https://bugs.ruby-lang.org/
> ______________________________________________
> ruby-core mailing list -- ruby-core@ml.ruby-lang.org
> To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
> ruby-core info --
> https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.=
org/
>
--=20
Austin Ziegler =E2=80=A2 halostatue@gmail.com =E2=80=A2 austin@halostatue.c=
a
http://www.halostatue.ca/ =E2=80=A2 http://twitter.com/halostatue
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/