でもブロックの外にあった変数とたまたま名前が同じだった場合は
ブロックの外にあった変数がブロックの中で最後に使われてた値が残っちゃうけどね!

x = "x!"
[1,2,3].each{|x| puts "hoo"}
p x #=> 3

上記は "x!" じゃなくて 3 だよ!

s = "very important string"
puts "s is #{s} before block"
['one', 'two', 'three'].each do |count|
s = count.upcase
puts s
end
puts "after block, s is #{s}"

適当すぎる変数名をあちこちで使い回す癖のある人は気をつけたほうがいいよ!
あと見かけが似てるけど if はブロックつきメソッドじゃないから
ブロックの中で定義した新変数はブロックの外に持ち越されるよ!

[1,2,3].each{|x| y=x}
p y rescue puts "each では y ないです"
if true then
y = 4
end
p y rescue puts "if では y ないです"