Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

and statement

2 views
Skip to first unread message

love...@gmail.com

unread,
Mar 4, 2008, 3:18:18 AM3/4/08
to
Hi,

I found the following statement in routing.rb of rails framework. I
haven't seen this kind of usage anywhere. Can somebody tell me what
does this statement do? I am particularly interested in knowing how
'and' behaves here.

result = route.recognize(path, environment) and return result

Thanks
-subbu

Robert Klemme

unread,
Mar 4, 2008, 4:05:01 AM3/4/08
to
2008/3/4, love...@gmail.com <love...@gmail.com>:

If /result/ is not /nil/ and not /false/ it will be returned here.
Otherwise control flow proceeds to the next line. Try it out in IRB

irb(main):001:0> def t(x) x and return x; 'not_returned' end
=> nil
irb(main):002:0> t 1
=> 1
irb(main):003:0> t 2
=> 2
irb(main):004:0> t false
=> "not_returned"
irb(main):005:0> t nil
=> "not_returned"
irb(main):006:0> t true
=> true
irb(main):007:0>

Kind regards

robert

--
use.inject do |as, often| as.you_can - without end

7stud --

unread,
Mar 4, 2008, 4:10:59 AM3/4/08
to

result = true and true
puts result

result = false and false
puts result

puts

x = 10
result = false and x = 20
puts result
puts x

result = true and x = 20
puts result
puts x

--output:--
true
false

false
10
true
20


The results are due to 'short circuiting' of the conditionals. If you
have this statement:

x and y

and x is false, then there is no way for the whole conditional to
evaluate to true. As a result, there is no need to evaluate the second
expression y to determine the result of the conditional--its going to be
false no matter what y evaluates to, and ruby chooses not to evaluate y.

The statement:

result = route.recognize(path, environment) and return result

is equivalent to:

result = route.recognize(path, environment)
if result
return result
end
--
Posted via http://www.ruby-forum.com/.

Subbu

unread,
Mar 4, 2008, 5:24:31 AM3/4/08
to
Thank you so much. I looked up 'and' && operands in the PickAxe book
and this is what it says:
"The 'and' and && operators evaluate their first operand. If false,
the expression returns the value of the first operand; otherwise, the
expression returns the value of the second operand"

I am really loving my Ruby journey.
-subbu

7stud --

unread,
Mar 4, 2008, 8:22:00 AM3/4/08
to
Subbu wrote:
> Thank you so much. I looked up 'and' && operands in the PickAxe book
> and this is what it says:
> "The 'and' and && operators evaluate their first operand. If false,
> the expression returns the value of the first operand; otherwise, the
> expression returns the value of the second operand"
>

Which doesn't appear to be true. Look at this:

result = (x=20)
puts result #20


result = true and x=20
puts result #true


The output isn't the same.

Lionel Bouton

unread,
Mar 4, 2008, 9:23:48 AM3/4/08
to
7stud -- wrote:
> Subbu wrote:
>> Thank you so much. I looked up 'and' && operands in the PickAxe book
>> and this is what it says:
>> "The 'and' and && operators evaluate their first operand. If false,
>> the expression returns the value of the first operand; otherwise, the
>> expression returns the value of the second operand"
>>
>
> Which doesn't appear to be true. Look at this:
>
> result = (x=20)
> puts result #20
>
>
> result = true and x=20
> puts result #true

Precedence...

result = (true and x = 20)

7stud --

unread,
Mar 4, 2008, 10:12:40 AM3/4/08
to
Lionel Bouton wrote:

> 7stud -- wrote:
>> result = (x=20)
>> puts result #20
>>
>>
>> result = true and x=20
>> puts result #true
>
> Precedence...
>
> result = (true and x = 20)

Ah. Thanks.

yermej

unread,
Mar 4, 2008, 4:18:21 PM3/4/08
to
On Mar 4, 8:23 am, Lionel Bouton <lionel-subscript...@bouton.name>
wrote:

Or:

result = true && x = 20

The precedence is the only difference between 'and' and '&&'.

Subbu

unread,
Mar 10, 2008, 12:27:30 PM3/10/08
to

Does that mean = has higher precedence than 'and'?

Justin Collins

unread,
Mar 10, 2008, 7:40:00 PM3/10/08
to

Subbu

unread,
Mar 11, 2008, 1:30:00 AM3/11/08
to

Great. Thanks.

0 new messages