ソースコード
Ruby
1def enjoy 2 output = "Enjoy " 3 yield 4 puts output 5end 6 7enjoy { output << "Programming!"}
Ruby
1def enjoy 2 output = "Enjoy " 3 Proc.new { output << "Programming!"}.call 4 puts output 5end 6 7enjoy
出力
Main.rb:7:in `block in <main>': undefined local variable or method `output' for main:Object (NameError) from Main.rb:3:in `enjoy' from Main.rb:7:in `<main>'
Enjoy Programming!
質問
1.上記二つのコードの出力結果が異なっている原因がわかりません。ブロックがProcオブジェクトへ変換されているのならこのようにしても同じになると思っています。
2.この原因について調べていたところ、手続きオブジェクトについてリファレンスには以下のように記載されていたのですが、あまり良く理解できませんでした。教えていただけると幸いです。
手続きオブジェクトとは
手続きオブジェクトとはブロックをコンテキスト(ローカル変数のスコープやスタックフレーム)とともにオブジェクトしたものです。Procクラスのインスタンスとして実現されています。ブロック内では、新たなスコープが導入されるとともに、外側のローカル変数を参照できます。
試したこと
ローカル変数をインスタンス変数に変えて実行したところ、予想通りの出力を得られました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。