Project

General

Profile

Actions

Feature #16183

open

Hash#with_default

Added by zverok (Victor Shepelev) almost 2 years ago. Updated almost 2 years ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:95104]

Description

Reasons: there is no way, currently, to declaratively define Hash with default value (for example, to store it in constant, or use in an expression). Which leads to code more or less like this:

FONTS = {
  title: 'Arial',
  body: 'Times New Roman',
  blockquote: 'Tahoma'
}.tap { |h| h.default = 'Courier' }.freeze

# Grouping indexes:
ary.each_with_object(Hash.new { |h, k| h[k] = [] }).with_index { |(el, h), idx| h[el.downcase] << idx }

With proposed method:

FONTS = {
  title: 'Arial',
  body: 'Times New Roman',
  blockquote: 'Tahoma'
}.with_default('Courier').freeze

ary.each_with_object({}.with_default { [] }).with_index { |(el, h), idx| h[el.downcase] << idx }

About the block synopsys: I am not 100% sure, but I believe that most of the time when default_proc provided, it looks like { |h, k| h[k] = some_calculation }. So, I believe for this "declarative simplification" of defaults, it is acceptable to assume it as the only behavior (pass only key to block, and always store block's result); more flexible form would still be accessible with Hash.new.

Actions

Also available in: Atom PDF