Project

General

Profile

Feature #17006

Updated by sawa (Tsuyoshi Sawada) over 4 years ago

Sometimes, we need to create a hash that has explicit key-value pairs as well as a default value, but there has not been a way to do that at once. The most naive way is to do like this: 

 ```ruby 
 h = {a: 1, b: 2} 
 h.default_proc = ->(h, k){raise ->(k, v){raise "Unknown key #{k}"} 
 h # => ... 
 ``` 

 A more sophisticated way is this: 

 ```ruby 
 Hash.new{|h, k| Hash.new{|k, v| raise "Unknown key #{k}"}.merge({a: 1, b: 2}) 
 ``` 

 But that is still not short enough, and it also looks backwards, i.e., we usually want to specify the explicit key-value pairs before the default value. 

 My proposal is to allow `Kernel#Hash` to take a block that provides the default value in the same way as the block of `Hash.new`: 

 ```ruby 
 Hash({a: 1, b: 2}){|h, k| 2}){|k, v| raise "Unknown key #{k}"} 
 ``` 

Back