On Wed, Mar 19, 2008 at 11:31:13AM +0900, Rick DeNatale wrote:
> On 3/18/08, Chad Perrin <perrin / apotheon.com> wrote:
> > On Tue, Mar 18, 2008 at 03:09:56PM +0900, Subbu wrote:
> >  > I came across &&= while reading some code. I know what ||= does but
> >  > not this one. Can someone explain what it does?
> >
> >
> > The other answers are not wrong, but they may not be clear.
> >
> >  Just as ||= sets the value of something if it doesn't already have one,
> >  &&= sets the value of something if it *does* already have one.
> >
> >   irb(main):001:0> a = nil
> >   => nil
> >   irb(main):002:0> b = 'foo'
> >   => "foo"
> >   irb(main):003:0> a &&= b
> >   => nil
> >   irb(main):004:0> a = 'foo'
> >   => "foo"
> >   irb(main):005:0> b = 'bar'
> >   => "bar"
> >   irb(main):006:0> a &&= b
> >   => "bar"
> 
> Almost, but not quite:
> 
> irb(main):001:0> a = false
> => false
> irb(main):002:0> b = 'foo'
> => "foo"
> irb(main):003:0> a &&= b
> => false
> irb(main):004:0> a
> => false
> irb(main):005:0> a ||= b
> => "foo"
> irb(main):006:0> a
> => "foo"
> irb(main):007:0>
> 
>  ||= sets the value of a variable if its value if nil or false,
> &&= sets the value of something if it its value is something other
> than nil or false.

Technically more correct than my answer, but mine wasn't *incorrect*.  It
just left out the "or false" bit.  Generally, ||= and &&= are used in
cases where the variable's value may be nil, in my experience, and I
forgot to consider the rest of the story.

-- 
CCD CopyWrite Chad Perrin [ http://ccd.apotheon.org ]
Marvin Minsky: "It's just incredible that a trillion-synapse computer could
actually spend Saturday afternoon watching a football game."