ローカル変数
ローカル変数のスコープは宣言した場所から始まります。代入は宣言の一種のようです(まだ、正確には調べていません)。
x = "outer" def rubyco x = "inner" puts x end rubyco #=> inner puts x #=> outer
代入が実行されなくても宣言と見なされます。これはパーザの気持ちになってみれば理解できます。「あ、この識別子はローカル変数だね」とパーザが知り得た箇所がスコープの開始だと想像しています。
以下のプログラムでは、代入は一つも実行されていませんが、NameError例外は発生していません。
puts defined?(x = "outer") #=> assignment def rubyco x = "inner" if false puts x end rubyco #=> nil puts x #=> nil