I came across &&= while reading some code. I know what ||= does but
not this one. Can someone explain what it does?
Thanks much
-subbu
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
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
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
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 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?
--
CCD CopyWrite Chad Perrin [ http://ccd.apotheon.org ]
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."
> 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.
On 3/18/08, Chad Perrin <perrin@apotheon.com> wrote:
On Tue, Mar 18, 2008 at 03:09:56PM +0900, Subbu wrote:
--
Rick DeNatale
My blog on Ruby
http://talklikeaduck.denhaven2.com/
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
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?
--
Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu/~kbloom1/
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 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.
--
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."
Thanks all for the detailed explanations. Really nice of you.
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/