ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:99042] [Ruby master Feature#17006] Let `Kernel#Hash` take a block to provide the default value
@ 2020-07-03  8:09 sawadatsuyoshi
  2020-07-04  7:36 ` [ruby-core:99050] " nobu
  2020-07-04  7:51 ` [ruby-core:99051] " sawadatsuyoshi
  0 siblings, 2 replies; 3+ messages in thread
From: sawadatsuyoshi @ 2020-07-03  8:09 UTC (permalink / raw
  To: ruby-core

Issue #17006 has been reported by sawa (Tsuyoshi Sawada).

----------------------------------------
Feature #17006: Let `Kernel#Hash` take a block to provide the default value
https://bugs.ruby-lang.org/issues/17006

* 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 = ->(k, v){raise "Unknown key #{k}"}
h # => ...
```

A more sophisticated way is this:

```ruby
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}){|k, v| raise "Unknown key #{k}"}
```




-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ruby-core:99050] [Ruby master Feature#17006] Let `Kernel#Hash` take a block to provide the default value
  2020-07-03  8:09 [ruby-core:99042] [Ruby master Feature#17006] Let `Kernel#Hash` take a block to provide the default value sawadatsuyoshi
@ 2020-07-04  7:36 ` nobu
  2020-07-04  7:51 ` [ruby-core:99051] " sawadatsuyoshi
  1 sibling, 0 replies; 3+ messages in thread
From: nobu @ 2020-07-04  7:36 UTC (permalink / raw
  To: ruby-core

Issue #17006 has been updated by nobu (Nobuyoshi Nakada).


The description mentions the default value first, but the proposal will solve the default proc only.

----------------------------------------
Feature #17006: Let `Kernel#Hash` take a block to provide the default value
https://bugs.ruby-lang.org/issues/17006#change-86424

* 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/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ruby-core:99051] [Ruby master Feature#17006] Let `Kernel#Hash` take a block to provide the default value
  2020-07-03  8:09 [ruby-core:99042] [Ruby master Feature#17006] Let `Kernel#Hash` take a block to provide the default value sawadatsuyoshi
  2020-07-04  7:36 ` [ruby-core:99050] " nobu
@ 2020-07-04  7:51 ` sawadatsuyoshi
  1 sibling, 0 replies; 3+ messages in thread
From: sawadatsuyoshi @ 2020-07-04  7:51 UTC (permalink / raw
  To: ruby-core

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/

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-07-04  7:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-07-03  8:09 [ruby-core:99042] [Ruby master Feature#17006] Let `Kernel#Hash` take a block to provide the default value sawadatsuyoshi
2020-07-04  7:36 ` [ruby-core:99050] " nobu
2020-07-04  7:51 ` [ruby-core:99051] " sawadatsuyoshi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).