Pois é quase um torrão de açúcar sintático no rubi!

Você sabia que o rubi foré quase um pedaço de açúcar sintático?
Sim, o forrubi não é assim nos outros.
Quando você escreve
for i in collection p i end
Ruby traduz em sth como:
collection.each do |i| p i end
Mas, a diferença é que eachinvoca o bloco de código repetidamente, enquanto foré apenas uma construção de linguagem.

Portanto, se a variável existia antes do bloco, aquela no bloco é a mesma que no bloco externo. Mas se a variável aparece apenas dentro do bloco, é local para o bloco, ela não pode ser acessada em qualquer lugar fora do bloco.

Há um bom exemplo para explicá-lo: https://gist.github.com/4109520