Rubyにおける「環境」の話

環境というのはスコープと言い換えてもいいけど、ようするに「今実行している行から何が見えて何が触れるのか」という話。一度自分の頭の整理のためにきちんとまとめておきたいと思っていたので昼休みを利用してまとめる。

基本

環境変数

ENVっていうハッシュのこと、これはプロセスにとってグローバルな環境である。つまり、どこからでも参照することが可能。

グローバル変数および定数

これもプロセスにとってグローバルな環境である。

self

どのようなインスタンス変数が見えるか、どのようなprivateメソッドが見えるかというのは言い換えると「self が何を指しているか」ということである。

selfが何を指しているかは基本的には以下の通りである

ローカル変数

メソッド内ならメソッド内で定義したローカル変数のみが見える(クラス内で定義したものやmain内で定義したものは見えないことに注意)。

クラス内ならクラス内で定義したローカル変数のみが見える(main内で定義したものは見えないことに注意)

ブロック内なら、そのブロックの外側で見えるローカル変数が見える。ブロックの内側で定義したローカル変数はブロックの外に影響を与えない。

以上が基本である。

応用

instance_eval

obj.instance_eval do
  p self # => obj
end

すると、block の中で見える self が obj を指すようになる。一方、見えるローカル変数は変わらない。このギャップを利用することでいろいろメタいことができる。

お昼休みおわるのでタイムアップ。