Bug #9081
closedUnexpected result for and opreator
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
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)