Project

General

Profile

Actions

Bug #9081

closed

Unexpected result for and opreator

Added by aminhotob (Mo Amin) about 11 years ago. Updated about 11 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin11.4.2]
[ruby-core:58162]

Description

I use this code to test and confirm this result

def show
@profile = .......
puts "=================="
puts user_signed_in?
puts current_user.id
puts @profile.user.id
puts user_signed_in? and (current_user.id == @profile.user.id)
puts true and (1 == 2)
puts true and false
puts true && false
puts "=================="
.......
end

this is console output

==================
User Load (0.6ms) SELECT users.* FROM users WHERE users.id = 3 ORDER BY users.id ASC LIMIT 1
true
3
User Load (0.4ms) SELECT users.* FROM users WHERE users.id = 11 ORDER BY users.id ASC LIMIT 1
11
true
true
true
false

the last two lines will clear the problem, I except and, && is the same !

ruby -v ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin11.4.2]
rails -v Rails 4.0.0


Files

Screen Shot 2013-11-05 at 2.21.40 AM.png (38.5 KB) Screen Shot 2013-11-05 at 2.21.40 AM.png aminhotob (Mo Amin), 11/05/2013 09:41 AM

Updated by gergoerdosi (Gergo Erdosi) about 11 years ago

This isn't unexpected behavior. (({and})) and (({or})) are not boolean, but control flow operators. Execution stops when an operation returns (({nil})) or (({false})). Use (({&&})) or (({||})) for the desired behavior.

Updated by Anonymous about 11 years ago

  • Status changed from Open to Rejected
  • Priority changed from 5 to Normal

This isn't a bug. The 'and' operator has lower precedence than '&&', so when you write this code:

puts true and false

It's parsed as:

puts(true) && false

If you instead write:

puts true && false

Then Ruby will parse this expression like this, as you intend:

puts(true && false)
Actions

Also available in: Atom PDF

Like0
Like0Like0