最近 Ruby を使っていて驚いたことがあるんです。それは Ruby では if 文に変数のスコープが無いということ。まずはサンプルを見てみてください。

#!/usr/bin/ruby

if true
  hoge = 100
end

puts hoge # 100

if 文の中で定義された hoge に if 文の外からアクセスしてる(((;゚Д゚))) ちなみに Perl だと・・・

#!/usr/bin/perl

use strict;
use warnings;

if (1) {
    my $hoge = 100;
}

print $hoge, "\n"; # Global symbol "$hoge" requires

よかった。やっぱりそうですよね。if 文に変数のスコープがあります。いや〜、Ruby と Perl で if 文の挙動が違っていたので最初びっくりしました>< どうも Ruby では、if や while といった制御文では変数のスコープが無いようです。つまり if や while 文の中で定義した変数に、その外側からもアクセス可能なんです。ただし def (メソッドの定義)やブロックにはもちろん変数のスコープがあります。

#!/usr/bin/ruby

def sample_method
  foo = 'sasata299'
end

puts foo # undefined local variable or method `foo'

array = [1, 2, 3]
array.map {|num| num * 2}

puts num # undefined local variable or method `num'

この辺ははっきり理解して自信を持って使っていきたいですねぇ(=゚ω゚)ノ
このエントリーをはてなブックマークに追加