From: RichardOnRails Date: 2009-11-05T05:30:06+09:00 Subject: Re: Ruby doesn't implement x++ for Fixnum's because ??? On Nov 4, 2:13 pm, Seebs wrote: > On 2009-11-04, RichardOnRails wrote: > > > class Fixnum > >   def pp # We can?t define ++ because of a compiler restriction. > >     self + 1 > >   end > > end > > This doesn't seem to do the right thing. > > a = 1 > a.pp > > Is a now 2?  If not, you haven't implemented an increment operator. > > > Appending these  lines shows that a & b values are distinct. > > That is,  after incrementing,  a =2,  b is unchanged; b is not > > impacted by a?s change > > a += 1; show (a)  =>  Got 2;  class = Fixnum;   object_id = 5;  v >> 1 > >= 2 > > show (b)  =>  Got 1;  class = Fixnum;   object_id = 3;  v >> 1 = 1 > > Right.  You've changed which object a refers to, because you've reassigned > a. > > > Appending these  lines shows the ++?s alias pp works just find > > a=1; show(a.pp)  =>  Got 2;  class = Fixnum;   object_id = 5;  v >> 1 > >= 2 > > show(b)  =>  Got 1;  class = Fixnum;   object_id = 3;  v >> 1 = 1 > > Not the same.  The key is that, after "a += 1", not only do you get 2, > but a is now 2. > > > Do you agree? > > No. > > For "a.pp" to be the same as a++ in other languages, you'd have to do: > > a = 1; a.pp; show(a) => Got 2 > > If you don't get a "2" by using a.pp, it's not an increment, just a "one > more than". > > Consider a loop: > > a = 1 > while ((a += 1) < 10) do >   puts a > end > > Now, try: > > a = 1 > while (a.pp < 10) do >   puts a > end > > Doesn't do the same thing. > > -s > -- > Copyright 2009, all wrongs reversed.  Peter Seebach / usenet-nos...@seebs.nethttp://www.seebs.net/log/<-- lawsuits, religion, and funny pictureshttp://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated! Hi Peter, > This doesn't seem to do the right thing. > > a = 1 > a.pp > > Is a now 2? If not, you haven't implemented an increment operator. Thanks for this question. You're so right. I couldn't see it until you pointed it out. class Fixnum def pp # We can’t define ++ because of a compiler restriction. self + 1 end end doesn't change self (which Ruby won't allow for Fixnum's!!! Which, of course, is why your: a = 1 while (a.pp < 10) do puts a end produces an infinite number of 1's ..., or would if RAM were infinite and hardware addressing mechanisms were infinite. I grateful for you taking the time to identify my deficiencies. Best wishes, Richard