And statement

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

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

···

2008/3/4, loveajax@gmail.com <loveajax@gmail.com>:

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

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

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

···

--
Posted via http://www.ruby-forum.com/\.

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.

···

--
Posted via http://www.ruby-forum.com/\.

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)

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.

···

--
Posted via http://www.ruby-forum.com/\.

Or:

result = true && x = 20

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

···

On Mar 4, 8:23 am, Lionel Bouton <lionel-subscript...@bouton.name> wrote:

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)

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

···

On Mar 4, 1:18 pm, yermej <yer...@gmail.com> wrote:

On Mar 4, 8:23 am, Lionel Bouton <lionel-subscript...@bouton.name> > wrote:

> 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)

Or:

result = true && x = 20

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

Subbu wrote:

···

On Mar 4, 1:18 pm, yermej <yer...@gmail.com> wrote:
  

On Mar 4, 8:23 am, Lionel Bouton <lionel-subscript...@bouton.name> >> wrote:

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)
      

Or:

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

Great. Thanks.

···

On Mar 10, 4:40 pm, Justin Collins <justincoll...@ucla.edu> wrote:

Subbu wrote:
> On Mar 4, 1:18 pm, yermej <yer...@gmail.com> wrote:

>> On Mar 4, 8:23 am, Lionel Bouton <lionel-subscript...@bouton.name> > >> wrote:

>>> 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)

>> Or:

>> result = true && x = 20

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

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

Yes.

The Ruby Language