Rubyにおけるトップレベルのオブジェクト
トップレベルでの self を表すオブジェクトです。
main では参照できない事に注意してください。トップレベルで self から参照してください。
トップレベルで定義したメソッドは Object の private インスタンスメソッドとして定義されます。
irbで確認してみよう
code:rb
irb(main):001:0> self
=> main
irb(main):002:0> main
(irb):2:in <main>': undefined local variable or method main' for main:Object (NameError)
irb(main):003:0> self.class
=> Object
トップレベルでメソッドを定義してみる
code:rb
irb(main):004:1* def foo
irb(main):005:1* 'foo'
irb(main):006:0> end
=> :foo
irb(main):007:0> self.private_methods.filter{|m| m.start_with?('f')}
トップレベルのprivateメソッドにfooメソッドが追加されたことがわかる
クラスを定義し、そのクラスのインスタンスからfooメソッドを参照できるか調べてみる
code:rb
irb(main):008:0> class C; end
=> nil
irb(main):009:0> C.ancestors
irb(main):010:0> c = C.new
irb(main):011:0> c.send(:foo)
=> "foo"
クラスCはObjectクラスを継承してるので、クラスCのインスタンスからsendメソッドでprivateメソッドfooを呼べる
後出しでトップレベルにメソッドbarを定義して、インスタンスcから呼べるか試してみる
code:rb
irb(main):012:0> c.send(:bar)
irb(main):013:1* def bar
irb(main):014:1* 'bar'
irb(main):015:0> end
=> :bar
irb(main):016:0> c.send(:bar)
=> "bar"
トップレベルにbarメソッドを定義する前はもちろん呼べない
トップレベルにbarメソッドを定義したあとは呼べる