トップレベル
トップレベルは main
という名前を持つ Object
(※ Module
や Class
ではない)
self # => main self.class # => Object self.is_a?(Module) # => false self.is_a?(Class) # => false
参考:
Ruby のオブジェクトは生物なんかじゃない、トップレベルこそが生物なんだ! | hp12c
What is the Ruby Top-Level? | Like Dream of Banister Fiend
object main
トップレベルでの self
を表すオブジェクト。
main
という変数はない。self
を使って参照する。
トップレベルで定義したメソッドは Object
の private
インスタンスメソッドとして定義される。
参考:
トップレベルと通常のクラスとの違い
トップレベルとクラス定義の違いは、クラス定義内では self
がそのクラスであることと呼び出し制限のデフォルトが異なることである。
クラス定義の中には任意の式を書くことができ、それらは全てクラス定義の際に実行される。
def
文でメソッドを定義する際に、デフォルトではクラス定義の外 (トップレベル) にあれば private
、クラス定義の中であれば public
としてメソッドを定義する。
参考:
クラス定義 – クラス/メソッドの定義 (Ruby 2.5.0)
呼び出し制限 – クラス/メソッドの定義 (Ruby 2.5.0)
トップレベルのメソッド
def say "Hey!" end say # => "Hey!" method(:say).owner # => Object Object.private_method_defined?(:say) #=> true
トップレベルのメソッドは、Object
のプライベートインスタンスメソッドとして定義される。
参考:
トップレベルメソッドの扱い | Secret Garden (Instrumental)
Ruby のトップレベルのメソッドの不思議 | As Sloth As Possible
Ruby のトップレベルについて調べた | light log
Definition of method in top level – Stack Overflow
Pry でトップレベルのメソッドを定義すると public になる
Pry / irb のコンソールからメソッドを定義した場合には、Object
のプライベートインスタンスメソッドではなくパブリックメソッドとなる。
[1] pry(main)> def hello; "hello"; end => :hello [2] pry(main)> private_methods.grep /hello/ => [] [3] pry(main)> methods.grep /hello/ => [:hello]
全てのクラスは (明示的に BasicObject
から継承したのでない限り) 基本的に Object
から派生しているので、トップレベルで定義したメソッドは、全てのオブジェクト (Object
から派生したクラスのインスタンス) 内で利用可能となる。
参考:
Pry ではトップレベルで定義したメソッドが Object クラスの public なインスタンスメソッドになる – Qiita
トップレベルの特異メソッド
トップレベルで定義した特異メソッドは、main
の特異クラスに定義される。
def self.hello "Hello!" end hello # => "Hello!" method(:hello).owner # => #<Class:#<Object:0x00001234xxxxabcd>> singleton_class.method_defined?(:hello) # => true method(:hello).owner == self.singleton_class # => true
参考:
今更聞けない! Ruby の継承と mixin の概念を継承リストから学ぶ | Secret Garden (Instrumental)
トップレベルメソッドの扱い | Secret Garden (Instrumental)
トップレベルで定義した変数のスコープ
参考:
ruby のトップレベルでの変数定義 | ritchiekotzen’s blog
グローバルスコープにメソッドを定義する方法
全ての場所からアクセス可能なメソッドを定義する方法:
- トップレベルでメソッドを定義する。
- メソッドを定義したモジュールを
Object
にinclude
する。 - メソッドを定義したモジュールをトップレベルで
include
する。
トップレベルでのみアクセス可能なメソッドを定義する方法:
- メソッドを定義したモジュールをトップレベルで
extend
する。
参考:
How can I add a method to the global scope in Ruby? – Stack Overflow
include
参考: