Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyでの可変スコープとバインディングオブジェクトの理解

スコープは、すべてのRuby開発者が理解するための重要な概念です。

なぜですか?

多くのエラーメッセージと混乱の原因であるためです。

スコープとは何ですか?

スコープとは、特定の時点で使用可能な変数を指します。

変数の種類が異なれば、スコープも異なります。

スコープは非常に狭い(ローカル変数)にすることができます または非常に広い(グローバル変数)

状態の変更と名前の衝突の問題を回避するために、可能な限り狭いスコープを使用する必要があります。

以下はのリストです スコープがRubyコードにどのように影響するかについて。

ローカル変数スコープ

ローカル変数のスコープは最も狭いです。

具体的には、メソッド内で定義されたローカル変数は、メソッドが戻った後は存在しなくなります。

ここに例があります

a = 50

def apple
  a = 100

  puts a
end

appleについてどう思いますか 印刷しますか?

答えはここにあります

appleを呼び出すとき 常に100を出力します 。

aという事実 メソッドの外部で定義されています 50として aには影響しません 変数メソッド内

それらは異なる変数です。

スコープを石鹸の泡として考える

この最初のa = 50 が1つのバブル内にある場合、メソッド、ANYメソッドを呼び出すと、新しいEMPTYバブルに入ります。

新しいバブルにローカル変数を持ち込むことはありません。

そしてメソッドが終わりに達したとき…

バブルが飛び出します。

バブル内の変数が消え、アクセスできなくなります。

これがローカル変数の仕組みです。

インスタンス変数スコープ

インスタンス変数の範囲は広くなります。

具体的には、Rubyオブジェクト内でデータを共有するために使用されます。

ここに例があります

class Fruit
  def more_juice
    @quantity = 100
  end

  def less_juice
    @quantity = 50
  end
end

この例では、@quantity 両方のmore_juiceで同じ変数です &less_juice メソッド。

これはメソッド間で共有される価値です。

しかし、このクラスの外で、そして別のFruitでも オブジェクト、@quantity 違います。

orange = Fruit.new
apple  = Fruit.new

orange.more_juice
apple.less_juice

すべてのオブジェクトには、独自のインスタンス変数のセットがあります。

したがって、この例では、orange @quantityがあります 100の、およびapple @quantityがあります 50の。

異なる人が異なる名前、年齢、国などを持っているように。

ブロックでスコープがどのように機能するか

スコープに関しては、ブロックは非常に興味深いものです。

バブルの例えをもう一度たどると、ブロックが行うことは、現在のバブルからローカル変数を取得することです。 。

それらにアクセスして変更できます。

a = []

3.times { a << 1 }

p a
# [1, 1, 1]

しかし...

バブルはまだポップし、ブロック内に作成された新しいローカル変数を削除します。

面白くないですか?

これが私の言いたいことの例です

1.times { b = [1,2,3] }

b
# NameError

それだけでなく、ブロックは作成された時点でバブルを運びます。

「閉鎖」と呼ばれる効果

この「バブル」は、ソースコードの特定のポイントでアクセスできるすべての変数のコレクションであることを忘れないでください。

これはスコープ自体であり、オブジェクトとしてカプセル化されています。

これをBindingと呼びます Rubyで。

Rubyバインディングの使用方法

この記事で共有したいもう1つの概念は、バインディングに関するものです。

これまで説明してきたこれらすべてのバブルを、BindingのオブジェクトであるRubyオブジェクトに保存できます。 クラス。

def banana
  a = 100

  binding
end

banana.class
# Binding

このバインディングオブジェクトはバブルです。

バブルを調べて、そこに何が入っているかを確認することもできます。

banana.send(:local_variables)
# [:a]

Railsスコープはどうですか?

RailsのスコープはRubyのスコープとは異なります。

では、Railsのスコープとは何ですか?

これは、ActiveRecordで構成されるカスタムデータベースクエリに名前を付ける方法です。 メソッド。

ここに例があります

class User < ApplicationRecord
  scope(:with_email) { where.not(email: nil) }
end

User.with_email

これをRubyのスコープの概念と混同しないでください🙂

概要

Rubyのスコープとバインディングオブジェクトについて学習しました!

スコープはアクセスできる変数を定義することを忘れないでください 任意の時点で。

これはバブルのようなもので、ローカル変数には独自のバブルがあり、オブジェクトはインスタンス変数などの別のバブルを共有します。

読んでくれてありがとう。


  1. Rubyで環境変数を使用する方法

    環境変数はキーと値のペアであり、次のようになります。 KEY=VALUE これらの変数を使用して、コンピューター内のすべてのプログラム間で構成オプションを共有します。 そのため、それらがどのように機能するか、およびENVを使用してRubyプログラムからそれらにアクセスする方法を学ぶことが重要です。 特別な変数。 環境変数の例 : デフォルトのエディターの構成 宝石の場所をRubyに伝える(GEM_PATH / GEM_HOME ) APIキーを、ソース管理(git)にコミットせずにアプリケーションに渡す オペレーティングシステムがバイナリファイル(Windowsでは.exe)を検

  2. Ruby Freezeメソッド–オブジェクトの可変性を理解する

    オブジェクトが可変であるとはどういう意味ですか? 派手な言葉で混乱させないでください。「可変性 」は、オブジェクトの内部状態を変更できることを意味します。これは、凍結されたオブジェクトを除く、すべてのオブジェクトのデフォルトです。 、または特別なオブジェクトのリストの一部であるもの。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではありません! 例 : 数字や記号、さらにはtrueには意味がありません またはfalse (オブジェクトでもあります)変更します。 数字の1は常に1になります。 ただし、他のオブジェクト、特に配列オブジェクトやハッシュオブジェクトなどのデー