#slice
and #slice!
behaviors are equivalent: both "return a subarray starting at the start index and continuing for length elements", the same way as #sort
and #sort!
return a sorted array or #reverse
and #reverse!
return a reversed array.
The difference is that the bang methods also modify the object itself.
a = [4,2,6,9,1,5,8]
b = a.dup
a.sort == b.sort! # => true
a == b # => false
b = a.dup
a.reverse == b.reverse! # => true
a == b # => false
b = a.dup
a.slice(2,2) == b.slice!(2,2) # => true
a == b # => false