From: sawadatsuyoshi@... Date: 2020-07-04T07:51:07+00:00 Subject: [ruby-core:99051] [Ruby master Feature#17006] Let `Kernel#Hash` take a block to provide the default value Issue #17006 has been updated by sawa (Tsuyoshi Sawada). nobu (Nobuyoshi Nakada) wrote in #note-2: > The description mentions the default value first, but the proposal will solve the default proc only. Default value is a special (static) case of default proc, so I think having the latter would be enough: ```ruby Hash({a: 1, b: 2}){0} ``` If there is concern for efficiency, at least for strings, we can turn on the frozen string mode. ```ruby # frozen_string_literal: true Hash({1 => "a", 2 => "b"}){"c"} ``` ---------------------------------------- Feature #17006: Let `Kernel#Hash` take a block to provide the default value https://bugs.ruby-lang.org/issues/17006#change-86425 * Author: sawa (Tsuyoshi Sawada) * Status: Open * Priority: Normal ---------------------------------------- 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 "Unknown key #{k}"} h # => ... ``` A more sophisticated way is this: ```ruby Hash.new{|h, k| 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| raise "Unknown key #{k}"} ``` -- https://bugs.ruby-lang.org/ Unsubscribe: