Issue #10683 has been reported by Recursive Madman.

----------------------------------------
Feature #10683: fix inconsistent behavior of Kernel.Hash()
https://bugs.ruby-lang.org/issues/10683

* Author: Recursive Madman
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
----------------------------------------
I find the way the global function `Hash` (aka `Kernel.Hash`) works a bit confusing.

To illustrate:

```ruby
Hash(nil) #=> {}  (1)
Hash({})  #=> {}  (2)
Hash([])  #=> {}  (3)
# but
Hash([[1,2]]) #! TypeError (4)
```

Case (1) and (2) make perfect sense to me (calling `Hash(var)` when `var` is an optional argument defaulting to `nil` will always give a (possibly empty) Hash or a TypeError, which is very useful).
Case (3) however seems inconsistent, since (4) doesn't work.

To contrast this with the respective `String` function:

```ruby
String([])  #=> "[]"
String('')  #=> ""
String({})  #=> "{}"
String(0)   #=> "0"
String(nil) #=> ""
```

it seems that calling `String(obj)` is equivalent to calling `obj.to_s`.

Thus I would assume `Hash(obj)` being equivalent to calling `obj.to_h`.

It is not though (calling `to_h` on `[[1,2]]` gives `{1=>2}`, while using `Hash()` raises a `TypeError`).

I propose to do **one** of the following changes:
* either remove the special handling of `[]`, such that only `nil` or a `Hash` are valid values to be passed to `Hash()`, or
* change `Hash()` to call `to_h` on it's argument, when the argument is neither `nil` nor a `Hash`.




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