ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
From: janfri26@gmail.com
To: ruby-core@ruby-lang.org
Subject: [ruby-core:91047] [Ruby trunk Feature#15526] New way to destruct an object hash
Date: Sat, 12 Jan 2019 15:05:00 +0000 (UTC)	[thread overview]
Message-ID: <redmine.journal-76267.20190112150459.7addcf8b6cb02af9@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-15526.20190111194516@ruby-lang.org

Issue #15526 has been updated by janfri (Jan Friedrich).


zverok (Victor Shepelev) wrote:
> 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.

+1 Great analysis.


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

* 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-12 15:05 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 ` [ruby-core:91032] " zverok.offline
2019-01-12 15:05 ` janfri26 [this message]
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-76267.20190112150459.7addcf8b6cb02af9@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).