[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

What does &&= do?

Subbu

3/18/2008 6:10:00 AM

I came across &&= while reading some code. I know what ||= does but
not this one. Can someone explain what it does?

Thanks much
-subbu
7 Answers

Jano Svitok

3/18/2008 6:29:00 AM

0

On Tue, Mar 18, 2008 at 7:09 AM, Subbu <subramani.athikunte@gmail.com> wrote:
> I came across &&= while reading some code. I know what ||= does but
> not this one. Can someone explain what it does?
>
> Thanks much
> -subbu

a &&=b is a shortcut for a = a && b

R.F. Pels

3/18/2008 9:18:00 AM

0

Subbu wrote:

> I came across &&= while reading some code. I know what ||= does but
> not this one. Can someone explain what it does?

self assignment
Examples:
foo += 12

Syntax:
expr op= expr # left hand side must be assignable.

This form evaluated as expr = expr op expr. But right hand side expression
evaluated once. op can be one of:
+, -, *, /, %, **, &, |, ^, <<, >>, &&, ||

There may be no space between operators and =. >

RTFM?

--
Ruurd

Chad Perrin

3/19/2008 1:26:00 AM

0

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?

--
CCD CopyWrite Chad Perrin [ http://ccd.ap... ]
McCloctnick the Lucid: "The first rule of magic is simple. Don't waste your
time waving your hands and hopping when a rock or a club will do."

Rick DeNatale

3/19/2008 2:31:00 AM

0

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.
--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denh...

Chad Perrin

3/19/2008 6:45:00 AM

0

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.ap... ]
Marvin Minsky: "It's just incredible that a trillion-synapse computer could
actually spend Saturday afternoon watching a football game."

Ken Bloom

3/19/2008 5:08:00 PM

0

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...

Subbu

3/22/2008 1:29:00 PM

0

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...

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