Ruby supports operator overloading — operators behave as methods of an object. So, << behaves differently based on the context. Generally for anything other than bit shifting << means to append or concatenate, such as with a string or an array. Concatenate is generally faster than addition — new objects are not created.
matt:~$ irb
>> 32 << 3
=> 256
>> "cat" << 'nip'
=> "catnip"
>> [0,2] << 2
=> [0, 2, 2]