Rubyのスコープゲート。 Part I

Mehdi Farsi

Follow

Sep 2, 2019 – 3 min read

この記事では、以下のトピックを探ります。

  • method scope
  • class scope

Before to start

私たちの最新のプロジェクトを紹介できることに興奮しています。 Ruby の楽しい事実 – Volume 1

この投稿をぜひ広めて共有してください! 🙏

お付き合いありがとうございました!

Rubyでは、プログラムのスコープはselfの値と強い相関があります。

ここでは、メソッド、クラス、トップレベルスコープのときにselfにどんな値があるのかを詳しく説明しましょう。

メソッドスコープ

Rubyでは、トップレベルスコープはmainオブジェクトのコンテキストです。

実際、selfは現時点ではmainオブジェクトを指しています。

さて、トップレベル スコープで定義されたメソッド内の self のコンテキストはどうなっているでしょうか。

ここで、selfmain オブジェクトを参照しています。

唯一の違いは、このメソッドの中でトップレベル スコープのローカル変数にアクセスできないことです。

これは、def キーワードによってメソッドのコンテンツが完全に分離したスコープに埋め込まれるためです。

しかし、私たちのメソッドはトップレベル スコープで宣言されたインスタンス変数にアクセスすることが可能です。

実際、インスタンス変数はオブジェクトレベルで宣言されているので、self が同じオブジェクト、この場合は main オブジェクトを参照している別のスコープでこれらの変数にアクセスできます。

したがって、トップレベルスコープとトップレベルスコープで定義されたメソッドのいずれかで main を指しているので、helloメソッドの中で @instance_variable インスタンス変数にアクセスできるようになりました。

クラススコープ

キーワードを使用した場合。

  • selfの値が変わる
  • クラスの内容が孤立したスコープに埋め込まれる

次の例を見てみましょう

ここで、このクラスではselfが異なる値になっており、Helloクラスを指していることが分かります。

また、クラスの外で定義された変数やメソッドにはアクセスできません。

記事の最初のセクションで説明したのと同じ理由で、インスタンスメソッドのインスタンス変数にアクセスできることに注意してください。

パート II & III では、モジュール、入れ子クラス、ブロック(フラットスコープ)を使って、スコープを使って遊びます。

Voilà !

コメントを残す

メールアドレスが公開されることはありません。