I'm working through a tutorial right now, and I'd like to understand why the following occurs:
original_string = "Hello, "
hi = original_string
there = "World"
hi += there
assert_equal "Hello, ", original_string
original_string = "Hello, "
hi = original_string
there = "World"
hi << there
assert_equal "Hello, World", original_string
Why does += have no effect on original_string, and << does?  I was absolutely certain that the second case would also equal "Hello, ", but that's not the case.
hi = original string in the first example appears to copy the value of original_string into hi, but hi = original string in the second example appears to set hi to point to the same string as original string.  I would guess there is some kind of implicit decision behind the scenes as to whether to copy the value or copy the reference... or something.
In Ruby, we use #concat to append a string to another string or an element to the array. We can also use #prepend to add a string at the beginning of a string.
The chop method is used to remove the last character of a string in Ruby. If the string ends with \r\n , it will remove both the separators. If an empty string calls this method, then an empty string is returned. We can call the chop method on a string twice.
The replace() is an inbuilt method in Ruby which replaces the contents of the set with the contents of the given enumerable object and returns self. Parameters: The function accepts an enumerable object which to be replaced in the set.
<< on string mutates the original object while += creates a copy and returns that.
See the object_id of the respective strings below:
2.1.1 :029 > original_string = "Hello, "
 => "Hello, " 
2.1.1 :030 > hi = original_string
 => "Hello, " 
2.1.1 :031 > there = "World"
 => "World" 
2.1.1 :032 > original_string.object_id
 => 70242326713680 
2.1.1 :033 > hi.object_id
 => 70242326713680 
2.1.1 :034 > hi += there
 => "Hello, World" 
2.1.1 :035 > hi.object_id
 => 70242325614780 
Note the different object_id on hi on line 35.  Once you reset hi to original_string in your example above, and use <<, it modifies the same object.
In both examples, hi = original_string copies the reference.
With +=, however, you reassign hi to point to a new string, even though the variable name is the same.
This is because hi += there expands in the interpreter to the expression hi = hi + there.
Before this operation, hi and original string share a reference to the same string object. Upon the = operation in the expanded expression, hi now references the newly-created string result of hi + there.
In the expression hi << there, nothing happens to change which object hi refers to. It refers to the same string as original_string, and therefore both hi and original_string reflect the change (which is of course due to the fact that they both reference the same string object).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With