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 `------------------------------'