| 
				    
				     
					    This page last changed on Apr 13, 2009 by skim.
				     
				    Scope of block variables
  | This problem is fixed in Ruby 1.9. Block parameters are strictly local.  |  
  
Consider the following code.  
x = 0
a = [1, 2, 3]
a.each { |x| }
puts 'x=' + x.to_s
  
One should naturally expect that x in the block following "a.each" is local to that block and that the output of this code will be "x=0". Yet the actual output is "x=3" as of ruby 1.8.7.  
So at this point one should again naturally conclude that x is global so that the following code will print "x=3". 
a = [1, 2, 3]
a.each { |x| }
puts 'x=' + x.to_s
  
But the actual output is 
my.rb:3: undefined local variable or method `x' for main:Object (NameError)  
The confusing matter of fact is, for a block variable x,  
	- if x is already defined, it refers to that variable;
 
	- if x is not yet defined, a new variable that is local to the block is created.
 
 
Precedence of or, and, &&, ||
Consider the following irb session: 
irb(main):001:0> true || true && false 
=> true 
irb(main):002:0> true or true and false 
=> false 
irb(main):003:0> false and true || true 
=> false  
Only the first line meets one's intuition, because "&&" has higher precedence than "||". 
The 2nd and 3rd happens because "and" and "or" has the same precedence, and "||" has higher precedence than "and". 
				    
                    			     |