What does &&= do?

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

Thanks much
-subbu

On Tue, Mar 18, 2008 at 7:09 AM, Subbu [email protected]
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

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?

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?

On Wed, Mar 19, 2008 at 11:31:13AM +0900, Rick DeNatale wrote:

irb(main):006:0> a &&= b
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.

On 3/18/08, Chad P. [email protected] wrote:

irb(main):001:0> a = nil
=> “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.denhaven2.com/

On Tue, 18 Mar 2008 20:26:22 -0500, Chad P. wrote:

=> nil

Is that clear enough?

Consider the following practical use I gave in my solution for Ruby Q.
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

On Mar 19, 10:08 pm, Ken B. [email protected] wrote:

irb(main):001:0> a = nil
=> “bar”
#find a single day, or a hyphenated range of days

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