Feature #16601
openLet `nil.to_a` and `nil.to_h` return a fixed instance
Description
Now, nil.to_s
returns a fixed instance:
nil.to_s.object_id # => 440
nil.to_s.object_id # => 440
nil.to_s.object_id # => 440
...
This is useful when we have some variable foo
which may be either nil
or a string, and we want to check its emptiness in a condition:
if foo.to_s.empty?; ... end
By this feature, we do not (need to) create a new instance of an empty string each time we check foo
, even when it happens to be nil
.
There are similar situations with arrays and hashes. We may have variable bar
which may be either nil
or an array, or baz
which may be either nil
or a hash, and we want to check their emptiness in conditions as follows:
if bar.to_a.empty?; ... end
if baz.to_h.empty?; ... end
But unlike nil.to_s
, the methods nil.to_a
and nil.to_h
create new instances of empty array or hash each time they are called:
nil.to_a.object_id # => 540
nil.to_a.object_id # => 560
nil.to_a.object_id # => 580
...
nil.to_h.object_id # => 460
nil.to_h.object_id # => 480
nil.to_h.object_id # => 500
...
The fact that this is somewhat inefficient discourages the use of foo.to_a
or foo.to_h
in such use cases.
I request nil.to_a
to nil.to_h
to return a fixed empty instance.