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のスコープとバインディングオブジェクトについて学習しました!
スコープはアクセスできる変数を定義することを忘れないでください 任意の時点で。
これはバブルのようなもので、ローカル変数には独自のバブルがあり、オブジェクトはインスタンス変数などの別のバブルを共有します。
読んでくれてありがとう。
-
Rubyで環境変数を使用する方法
環境変数はキーと値のペアであり、次のようになります。 KEY=VALUE これらの変数を使用して、コンピューター内のすべてのプログラム間で構成オプションを共有します。 そのため、それらがどのように機能するか、およびENVを使用してRubyプログラムからそれらにアクセスする方法を学ぶことが重要です。 特別な変数。 環境変数の例 : デフォルトのエディターの構成 宝石の場所をRubyに伝える(GEM_PATH / GEM_HOME ) APIキーを、ソース管理(git)にコミットせずにアプリケーションに渡す オペレーティングシステムがバイナリファイル(Windowsでは.exe)を検
-
Ruby Freezeメソッド–オブジェクトの可変性を理解する
オブジェクトが可変であるとはどういう意味ですか? 派手な言葉で混乱させないでください。「可変性 」は、オブジェクトの内部状態を変更できることを意味します。これは、凍結されたオブジェクトを除く、すべてのオブジェクトのデフォルトです。 、または特別なオブジェクトのリストの一部であるもの。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではありません! 例 : 数字や記号、さらにはtrueには意味がありません またはfalse (オブジェクトでもあります)変更します。 数字の1は常に1になります。 ただし、他のオブジェクト、特に配列オブジェクトやハッシュオブジェクトなどのデー