On Mar 19, 10:08 pm, Ken Bloom <kbl... / gmail.com> wrote:
> On Tue, 18 Mar 2008 20:26:22 -0500, Chad Perrin 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"
>
> > Is that clear enough?
>
> Consider the following practical use I gave in my solution for Ruby Quiz
> 144:
>
> DAYNAMES=%w[Sun Mon Tue Wed Thu Fri Sat]
> DAYNAME=%r{Sun|Mon|Tue|Wed|Thu|Fri|Sat}
> TIME=%r{[0-9]+}
>
> #find a single day, or a hyphenated range of days
> clause.scan(/(#{DAYNAME})(?:(?=\s)|$)|(#{DAYNAME})-(#{DAYNAME})/) \
>     do |single,start,finish|
>
>   #convert data in single, start, and finish only if they're not nil
>   #though the&&= is not strictly necessary since Array#index() handles
>   #nil properly, some conversions like obj.to_i will fail badly
>   #if obj is nil
>   single&&= DAYNAMES.index(single)
>   start&&= DAYNAMES.index(start)
>   finish&&= DAYNAMES.index(finish)
>
>   #do something with the ones that are not nil
>
> end
>
> --
> Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.
> Department of Computer Science. Illinois Institute of Technology.http://www.iit.edu/~kbloom1/

Thanks all for the detailed explanations. Really nice of you.