2

Rubyは次のeval()ようになります

def showblock(&block)
  puts eval("i * 3", block)
end

ここで、block は関数に渡されるブロックです。

ブロックの代わりに、バインディング オブジェクトを渡すこともできます。バインディング オブジェクトは、Javascript クロージャーが議論されるときによく言及される「スコープ チェーン」と呼ばれるものと同じですか?

4

1 に答える 1

2

いくつかの調査の後、私はそう言います。それらは関連する概念のようです。

JS のスコープ チェーンは、実行コンテキスト (変数バインディングなど) のリストを維持します。チェーンの一方の端には現在実行中のスコープのコンテキストがあり、もう一方の端にはグローバル スコープがあります。フリー変数を参照するクロージャーを作成するには、クロージャーに到達できる限り、そのコンテキストのリストを保持する必要があります。

Ruby Binding オブジェクトのドキュメントには次のように書かれています。

クラス Binding のオブジェクトは、コード内の特定の場所で実行コンテキストをカプセル化し、将来の使用のためにこのコンテキストを保持します。変数、メソッド、self の値、および場合によってはこのコンテキストでアクセスできる反復子ブロックはすべて保持されます。バインディング オブジェクトは Kernel#binding を使用して作成でき、Kernel#set_trace_func のコールバックで使用できます。

これらのバインディング オブジェクトは、Kernel#eval メソッドの 2 番目の引数として渡すことができ、評価のための環境を確立します。

Binding がどのように実装されているかの内部構造についてはあまり知りませんが、将来の評価のためにコンテキストを保存するという同じ目的を果たしているようです。

于 2010-07-21T03:52:46.517 に答える