and statement

L

loveajax

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
 
R

Robert Klemme

2008/3/4 said:
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

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
 
7

7stud --

unknown said:
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

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
 
S

Subbu

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
 
7

7stud --

Subbu said:
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.
 
L

Lionel Bouton

7stud said:
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)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,285
Messages
2,571,416
Members
48,107
Latest member
AmeliaAmad

Latest Threads

Top