From: 0x0dea+redmine@... Date: 2015-09-10T23:42:02+00:00 Subject: [ruby-core:70719] [Ruby trunk - Bug #11520] Inconsistent behavior in Array#compact! Issue #11520 has been updated by D.E. Akers. This behavior is consistent with many other "bang methods" which return `nil` if they might have mutated the receiver but didn't: ``` ruby [ '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. ---------------------------------------- Bug #11520: Inconsistent behavior in Array#compact! https://bugs.ruby-lang.org/issues/11520#change-54104 * Author: Hal Brodigan * Status: Open * Priority: Normal * Assignee: * ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- I noticed that `Array#compact!` sometimes returns `self` and other times `nil`. This behavior was a bit confusing. [].compact! # => nil [1].compact! # => nil [nil].compact! # => [] [1, nil].compact! # => [1] I would prefer that `Array#compact!` either always returns `nil`, or always returns `self`. -- https://bugs.ruby-lang.org/