Hi,

Any comments? Since everything in ruby is object, += is a method of the
object preceding it, why can't ++ like that? it can be defined to avoid
the "immutable" property discussed, anyway. A little more confused... I
guee I have asked this question...

Shannon

On Sat, 7 Dec 2002 06:08:47 +0900
"Mills Thomas (app1tam)" <app1tam / ups.com> wrote:

> I've worked it out in my mind why ++ isn't valid.  Maybe my thoughts will
> help others.  And maybe someone can straighten me out if I'm wrong!
> 
> Following is an annotated irb session:
> 
> irb(main):001:0> a="abc"
> "abc"
> irb(main):002:0> a.id   # The "abc" string has a particular ID
> 22443468
> irb(main):003:0> a.succ!# succ!() is only similar to ++ for numbers
> "abd"                   # but is actually a well defined method
> irb(main):004:0> a.id   # for introducing an effect on the string.
> 22443468                # Interestingly, we KEEP the same instance
>                         # and only the contents had to change!
> irb(main):005:0> a += "efg"
> "abdefg"
> irb(main):006:0> a
> "abdefg"
> irb(main):007:0> a.id   # With the above operation, we had to get a new
> 22410024                # instance since we did an assignment.
>                         #
> irb(main):008:0> b=123  # Now consider Integers:
> 123                     #
> irb(main):009:0> b.id   # Now we have a particular Integer object.
> 247                     # Indeed, all 123 integers will have this ID
> irb(main):010:0> b++    #
> irb(main):011:0*        # As you can see, this op is invalid.  To be 
> irb(main):012:0*        # like succ!, it would require keeping the 
> irb(main):013:0* d      # SAME object but altering that objects CONTENTS
>                         # (said contents being the immutable number 123).
>                         # Compare the annotations for a.succ! and b++
>                         # to convince yourself.
> Error: ...              # But Integer values are immutable!
>                         # Otherwise, the number 3 could become 4 and 
>                         # you'd end up with a silly Monty Python skit.
>                         # ["1, 2, 4" "NO, 3, Sir!" "OH, 3!" BOOM!]
>                         #
> irb(main):014:0> b += 5 # Now this operation works because the language
> 128                     # 'knows' how to find the item in the set of
> irb(main):015:0> b.id   # Integer values that is '5' beyond '123' and 
> 257                     # Ruby then returns then assigns the reference
>                         # of this newly found '128' object to the
>                         # variable.  NOTE: assignment of a new instance
>                         # has happened just as in the String += op.
> 
> The important part of the explanation is the b++ annotation.
> 
> I hope I have it right.  And if I do have it right, I hope it's the kind of
> explanation that makes sense to someone else and can enlighten.
> 
> Good day.
> 
> +------------------------------------------------+
> | DREW MILLS            | 10101 Linn Station Rd. |
> |                       | Suite 800              |
> | tamills / ups.com       | Louisville, KY  40223  |
> | Technical Specialist  | <v> 502-394-7785       |
> | United Parcel Service | <f> 502-394-7812       |
> +------------------------------------------------+