Project

General

Profile

Feature #13122

Special syntax for Hash#default_proc

Added by woodruffw (William Woodruff) over 2 years ago. Updated about 2 years ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:79046]

Description

The current Hash#default_proc flow usually looks something like this:

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:

MY_HASH = {
  key: "value"
}.freeze

needs to become

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:

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:

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

History

Updated by nobu (Nobuyoshi Nakada) over 2 years ago

What about

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

?

Updated by woodruffw (William Woodruff) over 2 years ago

Nobuyoshi Nakada wrote:

What about

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

?

Ah, I forgot about that...

That definitely works, and solves the problem without a need for new syntax. Please close if you don't see the need for these changes.

Thanks!

Updated by woodruffw (William Woodruff) over 2 years ago

Realized I forgot commas in the examples:

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

and


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

Updated by nobu (Nobuyoshi Nakada) over 2 years ago

Maybe both of elements and a block would be nice.

Updated by matz (Yukihiro Matsumoto) about 2 years ago

  • Status changed from Open to Rejected

I don't think default_proc is not worth adding a new syntax.

Matz.

Also available in: Atom PDF