それについて考える良い方法は、バインディングはコンテキストをカプセル化するオブジェクトであるということです。binding
次のキーワードを使用して、バインディングオブジェクトを表示できます。
a = 10 # a is defined in the 'main' context
def get_binding # so is the 'get_binding' method
b = 20
binding
end
n = get_binding #=> #<Binding:0x00...>
get_binding
はコンテキスト内で定義されてmain
いるため、返されるバインディングオブジェクトには、メインコンテキストだけでなくメソッドのローカルコンテキスト内のすべてのものが含まれます。変数b
はで使用できませんがmain
、a
で使用できますget_binding
。
これは、次を使用してバインディングオブジェクトと対話することで実証できますeval
。
a #=> 10
eval('a', n) #=> undefined local variable or method 'a' for main:Object
b #=> undefined local variable or method `b' for main:Object
eval('b', n) #=> 20 # but it is defined within the context the n binding was created.
明確にするために-この例は、舞台裏で何が起こっているかを明らかにしています。バインディングオブジェクトを直接処理する必要がある場合は、めったにありません。
Rubyモジュール、クラス、およびメソッドは、それらよりも階層の下位にあるオブジェクトへのバインディングを明らかにしますが、パブリックインスタンスメソッドなどによって明示的に明らかにされない限り、その逆はありません。これは少し単純化しすぎていますが、実際にはそうではありません。プログラミングに不慣れな場合は、これを深く理解する必要があります。