Issue #13122 has been updated by Nobuyoshi Nakada.


What about

```ruby
MY_HASH = Hash.new {|h, k| "other value"}.update(
  key: "value",
).freeze
```
?


----------------------------------------
Feature #13122: Special syntax for Hash#default_proc
https://bugs.ruby-lang.org/issues/13122#change-62455

* Author: William Woodruff
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
The current Hash#default_proc flow usually looks something like this:

~~~ ruby
my_hash = { key: "value" }
my_hash.default_proc = proc { |h, k| h[k] = "other value" }
~~~

This makes the common practice of freezing large constant hashes unwieldy. For example,
this:

~~~ruby
MY_HASH = {
  key: "value"
}.freeze
~~~

needs to become

~~~ruby
MY_HASH = {
  key: "value"
}

MY_HASH.default_proc = proc { |h, k| h[k] = "other value" }

MY_HASH.freeze
~~~

if a `default_proc` is used.

I propose a new syntax for setting the default_proc within the hash-declaration itself:

~~~ruby
my_hash = {
  key: "value"
  *: proc { |h, k| h[k] = "other value" }
}
~~~

`*:` as a hash-key is currently a syntax error, so I think there's space in the language for this. Of course, this should also support rocket-style:

~~~ruby
my_hash = {
  "key" => "value"
  * => proc { |h, k| h[k] = "other value" }
}
~~~

(I'm completely open to alternative syntaxes, `*` just comes to mind because of wildcarding).

I'm happy to attempt work on this, if this feature is desired. I have experience with MRI's API, but not with writing new syntax (which I assume would go in parse.y), so I'd appreciate the help of someone who's familiar with the intricacies of parse.y.

Best,
William Woodruff



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

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>