matz / zetabits.com (Yukihiro Matsumoto) wrote:
> Hi,
> 
> Can you tell the results from the following?
> And what is the reasons for the results?


Ooh, fun!!

>   line = "abab"
>   print line.sub!(/a/, 'A') + line.sub!(/b/, 'B'), "\n"

Well, let's see:

line.sub!(/a/, 'A') is called and returns a reference to line (now "Abab")
line.sub!(/b/, 'B') is called and returns a reference to line (now "ABab")

The reference to line is added to itself, returning a new string and 
equivalent to having done the sequence:

line.sub!(/a/, 'A').sub!(/b/, 'B') + line	# or * 2
"ABabABab"
 
>   line = "abab"
>   print line.sub!(/a/, 'A') + " " + line.sub!(/b/, 'B'), "\n"

line.sub!(/a/, 'A') is called, returning a reference to line (now "Abab")
String#+(" ") is called on line, following left-to-right + operator
  evaluation, returning the new string "Abab ", not equal to line
line.sub!(/b/, 'B') is called, returning a reference to line (now "ABab")
String#+(line) is called on the new string "Abab ", and "Abab " + "ABab" is
  "Abab ABab"


> Be careful of the bang. ;-)

Powerful, but deadly =)

> 							matz.


--
 Brian Fundakowski Feldman           \  FreeBSD: The Power to Serve!  /
 green / FreeBSD.org                    `------------------------------'