ローカル変数

ローカル変数のスコープは宣言した場所から始まります。代入は宣言の一種のようです(まだ、正確には調べていません)。

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