Actions
Feature #10683
openfix inconsistent behavior of Kernel.Hash()
Feature #10683:
fix inconsistent behavior of Kernel.Hash()
Status:
Open
Assignee:
-
Target version:
-
Description
I find the way the global function Hash (aka Kernel.Hash) works a bit confusing.
To illustrate:
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:
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 onlynilor aHashare valid values to be passed toHash(), or - change
Hash()to callto_hon it's argument, when the argument is neithernilnor aHash.
Actions