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
2008/3/4, [email protected] [email protected]:
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
unknown wrote:
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
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
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.
7stud – wrote:
result = (x=20)
puts result #20
result = true and x=20
puts result #true
Precedence…
result = (true and x = 20)
On Mar 4, 8:23 am, Lionel B. [email protected]
wrote:
result = (x=20)
puts result #20
result = true and x=20
puts result #true
Precedence…
result = (true and x = 20)
Or:
result = true && x = 20
The precedence is the only difference between ‘and’ and ‘&&’.
On Mar 4, 1:18 pm, yermej [email protected] wrote:
the expression returns the value of the first operand; otherwise, the
Precedence…
result = (true and x = 20)
Or:
result = true && x = 20
The precedence is the only difference between ‘and’ and ‘&&’.
Does that mean = has higher precedence than ‘and’?
Subbu wrote:
Subbu wrote:
puts result #20
result = true && x = 20
The precedence is the only difference between ‘and’ and ‘&&’.
Does that mean = has higher precedence than ‘and’?
Yes.
http://phrogz.net/ProgrammingRuby/language.html#table_18.4
On Mar 10, 4:40 pm, Justin C. [email protected] wrote:
Thank you so much. I looked up ‘and’ && operands in the PickAxe book
result = true and x=20
The precedence is the only difference between ‘and’ and ‘&&’.
Does that mean = has higher precedence than ‘and’?
Yes.
The Ruby Language
Great. Thanks.