Misc #11520

Inconsistent behavior in Array#compact!

Added by postmodern (Hal Brodigan) over 5 years ago. Updated over 5 years ago.



I noticed that Array#compact! sometimes returns self and other times nil. This behavior was a bit confusing.

# => nil

# => nil

# => []

[1, nil].compact!
# => [1]

I would prefer that Array#compact! either always returns nil, or always returns self.


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'.sub!(/\d/, 'x'),
  'bar'.gsub!(/\d/, 'x'),
  'abc'.tr!('def', 'ghi'),

].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.


Updated by postmodern (Hal Brodigan) over 5 years ago

  • Tracker changed from Bug to Misc

Ah, I was unaware that was the intention. I guess I should use .tap(&:compact!) instead. This issue can be closed.


Updated by nobu (Nobuyoshi Nakada) over 5 years ago

  • Status changed from Open to Rejected

Also available in: Atom PDF