Inconsistent behavior in Array#compact!
I noticed that
Array#compact! sometimes returns
self and other times
nil. This behavior was a bit confusing.
.compact! # => nil .compact! # => nil [nil].compact! # =>  [1, nil].compact! # => 
I would prefer that
Array#compact! either always returns
nil, or always returns
Updated by 0x0dea (D.E. Akers) over 5 years ago
This behavior is consistent with many other "bang methods" which return
nil if they might have mutated the receiver but didn't:
[ 'foo'.downcase!, 'BAR'.upcase!, 'Baz'.capitalize!, 'foo'.strip!, 'bar'.lstrip!, 'baz'.rstrip!, 'foo'.sub!(/\d/, 'x'), 'bar'.gsub!(/\d/, 'x'), 'abc'.tr!('def', 'ghi'), [1,2,3].compact!, [1,2,3].flatten!, [1,2,3].uniq! ].any? # => false
This idiom is a Good Thing because it provides you with greater information density than if these methods simply returned the mutated receiver, since that's something to which you already have a reference. In the common enough case that you want to know whether something changed, you can simply use the return value rather than storing a copy of the object and comparing it before and after (potential) mutation.