Mischievous of bang operator in ruby
This is a typical ruby programmer's style of overwriting on the same object:
array = [1.2 , 2.7]
array.map!(&:floor)
This will modify my same object array.
puts array
#=> [1,2]
Similarly, the below code removes nil values from an array :
array = [1 , 2, nil, 3, nil, 5]
new_array = array.compact
puts new_array
#=> [1,2,3,5]
But if we try to use bang operator for compact we will end up with nil for no nil value cases in an array.
array = [1 , 2, 3] # No nil values present
array.compact!
puts array
#=> nil
This can easily escapes from our eyes while debugging the code.
http://ruby-doc.org/core-1.9.3/Array.html#method-i-collect-21
Written by karthik selvakumar
Related protips
3 Responses
My Output :
array = [1 , 2, 3]
=> [1, 2, 3]
> array.compact!
=> nil
puts array
1
2
3
=> nil
Are you using older version of ruby ?
He linked to the docs for collect, so I'm assuming that's where he went sideways.
That aside, ! is an operator, but methods with the bang suffix have nothing to do with that.
! at the end of a method is not an operator, just part of the method signature.