ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
From: zverok.offline@gmail.com
To: ruby-core@ruby-lang.org
Subject: [ruby-core:91032] [Ruby trunk Feature#15526] New way to destruct an object hash
Date: Fri, 11 Jan 2019 20:35:23 +0000 (UTC)	[thread overview]
Message-ID: <redmine.journal-76253.20190111203521.c0250ec1914b7858@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-15526.20190111194516@ruby-lang.org

Issue #15526 has been updated by zverok (Victor Shepelev).


> Admit it, you only wanted to use `.then`

That's absolutely not the point. The real point here is: 

1) Ruby has very consistent "argument **deconstruction**" rules. Basically, "it is deconstructed the same way it is constructed", e.g., if you can _call_ (construct) with arguments like `meth(a, *b, c: 1, d: 2, **e)`, you can also _receive_ (deconstruct) arguments exactly the same way: `a, *b, c:, d: nil, **e`.

2) The deconstruction is fully enabled in arguments (including keyword arguments) to procs and methods

3) Initially (before keyword arguments), the variable assignment had the same "expressive power", e.g. you could define a method like 

```ruby
def meth(a, b, *rest)
```
...and you could assign variables the same way:

```ruby
a, b, *rest = [1, 2, 3, 4]
```

4) When keyword arguments were introduced, there was no matching syntax for variable assignment. If it **would** exist, it most probably **should** look this way (same as arguments, remember):

```ruby
a:, b:, **kwrest = {a: 1, b: 2, c: 3, d: 4}
```
It obviously looks confusing (and would probably be hard for the parser), and I believe that's the reason it was NOT added to the language.

5) I don't think adding "orphan feature" (looking like nothing else in the language) just for the sake of this particular case would be ever accepted; and I don't think it should.

6) In the meantime, "chainable" code style (with `Enumerable` and `#then`) allows to embrace argument deconstruction in its full force:
```ruby
config.then { |host:, port: 8080, **rest|
```
...which is NOT the main (and obviously not the only) reason to use this style, just a nice side-effect of its consistency with the rest of the language.

----------------------------------------
Feature #15526: New way to destruct an object hash
https://bugs.ruby-lang.org/issues/15526#change-76253

* Author: alissonbruno.sa (Alisson  Santos)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
JavaScript has a nice a neat way to destruct objects.

~~~ javascript
const person = { name: "John Doe", age: 33 };
const { name, age } =  person;
~~~

Erlang has a similar way to destruct a tuple:
~~~ erlang
Person = {"John Doe", 33}
{Name, Age} = Person
~~~

I think it's very handy and would be nice if we have something similar in Ruby.

~~~ ruby
config = { host: 'localhost', port: 3000 } 
{ host, port } = config
~~~

I know Ruby has Hash#values_at, but I think this way it's more readable and understandable

What do you guys think?




-- 
https://bugs.ruby-lang.org/

  parent reply	other threads:[~2019-01-11 20:35 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <redmine.issue-15526.20190111194516@ruby-lang.org>
2019-01-11 19:45 ` [ruby-core:91028] [Ruby trunk Feature#15526] New way to destruct an object hash alissonbruno.sa
2019-01-11 19:57 ` [ruby-core:91030] " zverok.offline
2019-01-11 20:15 ` [ruby-core:91031] " shevegen
2019-01-11 20:35 ` zverok.offline [this message]
2019-01-12 15:05 ` [ruby-core:91047] " janfri26
2019-01-14 15:45 ` [ruby-core:91083] " elia

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.ruby-lang.org/en/community/mailing-lists/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=redmine.journal-76253.20190111203521.c0250ec1914b7858@ruby-lang.org \
    --to=ruby-core@ruby-lang.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).