トップレベル

トップレベルは main という名前を持つ Object(※ ModuleClass ではない)

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 を使って参照する。

トップレベルで定義したメソッドは Objectprivate インスタンスメソッドとして定義される。

参考:

object main (Ruby 2.6.0)

トップレベルと通常のクラスとの違い

トップレベルとクラス定義の違いは、クラス定義内では 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

参考:

singleton method main.include (Ruby 2.5.0)

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です