ローカル変数の理解の仕方
お世話になっております。
メタプログラミング Ruby第2版を読んでいてローカル変数について疑問を持った部分がありました。
以下が該当箇所です。
Ruby
1def define_methods 2 shared = 0 3 4 Kernel.send :define_method, :counter do 5 shared 6 end 7 8 Kernel.send :define_method, :inc do |x| 9 shared += x 10 end 11end 12 13define_methods # 1回目 14p counter 15p inc(4) 16p counter 17 18define_methods # 2回目(再定義、sharedが初期化される) 19p counter 20p inc(10) 21p counter 22 23p shared # undefined local variable or method `shared' for main:Object (NameError) 24
出力結果
0 4 4 0 10 10 shared_scope.rb:23:in `<main>': undefined local variable or method `shared' for main:Object (NameError)
最後の、p shared
でNameErrorが起こるのは理解出来ます。
sharedを定義したスコープが閉じられているからです。
ただ、スコープを開始して、その中でローカル変数を定義した場合、スコープが閉じられることでローカル変数は消滅するものだという理解の仕方をしていました。
しかしながら、このコードでは、sharedという変数は値を所持した状態でメモリに残り続けているようです。
理解として、
ローカル変数sharedは
define_methodでメソッドを定義したコードの中身で参照されているため、ガーベジコレクタでメモリ開放処理がされず、スコープが閉じられてもメモリに残り続けるという考え方でいいのでしょうか?
Rubyのバージョン
ruby 2.2.5
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/25 06:50