Actions
Feature #16183
openHash#with_default
Status:
Open
Assignee:
-
Target version:
-
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
Like0
Like0Like0Like0Like0Like0Like0