Você sabia que o rubi for
é quase um pedaço de açúcar sintático?
Sim, o for
rubi 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 each
invoca 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