2

変数バインディングの意味を理解しているかどうかはわかりません。これは、Rubyに固有ではないプログラミングの概念である可能性があります。一部の本では、それが何を意味するのかをすでに知っていることを期待しているというのが、ほとんど基本的な概念のようです。

これまでの私の理解は次のとおりです。Rubyオブジェクトがインスタンス化されるときはいつでも、これが実際に意味するのは、Rubyがこのオブジェクトを指定するためにメモリ内にスペースを割り当てるということです。オブジェクトを変数に割り当てる場合、実際にはオブジェクトを変数に格納するのではなく、そのオブジェクトへの参照を変数に格納します。バインディングとは、変数がそれに関連付けられたオブジェクトに「バインド」されるこの概念を指していると思いますが、これがバインディングとバインドの意味を表しているかどうかは完全にはわかりません。

誰かが私にこれを説明するのを手伝ってもらえますか、できれば簡単な例を使って説明できますか?

4

2 に答える 2

2

2番目の段落で言及している概念はポインターに関するものであり、バインディングに直接関係していません。

お気づきのとおり、バインディングはRubyに固有のものではありません。自然言語だけでなくプログラミング言語を含む言語の正式な取り扱いで広く使用されている用語です。プログラミング言語では定数と呼ばれ、自然言語では適切な名詞(またはカジュアルなアメリカ人も名前と呼びます)と呼ばれる、独自の固定された意味を持つ式があります。反対に、それ自体では何も参照しないが、何らかの方法でそれらの値を割り当てる必要がある式があります。これらはプログラミング言語では変数と呼ばれ、自然言語では代名詞と呼ばれます。

変数に値が割り当てられていないコンテキストでは、変数はフリーであると言われます。それ以外の場合、変数はバインドされます。次の式の変数xは無料です。

x**2

変数をバインドする方法はいくつかあります。1つの方法は割り当てです。以下では、最初の行にx値が割り当てられている3ため、スコープ内にバインドされています。

x = 3
x**2

別の方法は、それを定量化することです。以下ではx、ブロック内はブロックのx外側にバインドされています。アウターxが取る値は、インナーの値になりますx

->x{x**2}

一方、x上記の式のアウターはバインドされていません。以下のような値に対してprocを呼び出すことにより、バインドされます。

->x{x**2}.call(3)
于 2013-02-16T04:26:38.123 に答える
1

それについて考える良い方法は、バインディングはコンテキストをカプセル化するオブジェクトであるということです。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はで使用できませんがmainaで使用できます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モジュール、クラス、およびメソッドは、それらよりも階層の下位にあるオブジェクトへのバインディングを明らかにしますが、パブリックインスタンスメソッドなどによって明示的に明らかにされない限り、その逆はありません。これは少し単純化しすぎていますが、実際にはそうではありません。プログラミングに不慣れな場合は、これを深く理解する必要があります。

于 2013-02-16T04:35:10.010 に答える