JavaScript クロージャーでは、実際に関数呼び出しを行うオブジェクトへの「this」参照。
ruby Proc/lambdaにも「this」機能がありますか?
そうでない場合、Ruby で「これ」が必要な場合はどうすればよいですか? パラメータによって現在のオブジェクトを Proc/lambda に渡すことを除いて。
this
一般に、関数またはクロージャーの概念の一部ではありません。関数は、引数を指定して呼び出すことができる単純なものです。「現在のオブジェクト」はそれと何の関係がありますか? this
JavaScript のすべての関数に存在するのは、メソッドがその言語で動作する独特の方法に由来します。
JavaScript では、メソッドと関数の間に分離this
がないため、すべての関数に の概念があります。どの関数もメソッドとして使用できる可能性があります。関数をオブジェクトの属性として割り当てるだけで、オブジェクトにメソッドを追加できます。さらに、JavaScript では、関数は現在のオブジェクトの明示的なパラメーターを持ちません (Python などとは異なります)。では、メソッドはどのようにしてそのオブジェクトにアクセスできるのでしょうか? メソッド呼び出し式を実行すると、呼び出したオブジェクトが暗黙的なパラメーターとして関数に渡されます。ただし、属性を使用して関数を取得し、他の関数と同じように手動で呼び出すと、グローバル オブジェクトになります (厳密モードでは未定義)。this
this
つまり、JavaScript で属性によってオブジェクトからメソッドを取得する場合、それは「バインドされていないメソッド」です。元のオブジェクトはわかりません。逆に、関数を属性によるメソッドとしてオブジェクトに入れる場合、その関数は開始するオブジェクトを知る必要はありません。オブジェクトは、呼び出された時点でメソッド呼び出し構文によって魔法のように渡されます。関数でまたはメソッドを使用して、人為的this
に関数に引数を与えることもできます (は と同等です)。.call()
.apply()
obj.foo(x)
obj.foo.call(obj, x)
Ruby では、メソッドと無名関数が完全に分離されています。lambda
、proc
、またはなどを使用して作成された無名関数Proc.new
はデータであり、変数に格納できます。メソッドとは異なる構文 (call
または[]
) で呼び出されます。メソッドは を使用して定義されてdef
おり、その名前を記述するだけではデータとして取得できません (それが呼び出されます)。オブジェクトのメソッドを使用してオブジェクトからメソッドを取得し、method
メソッド名を指定して、オブジェクトを返すことができMethod
ます。Method
オブジェクトをオブジェクトのように使用できProc
ます。たとえば、オブジェクトを呼び出すことができますcall
。Proc
withに変換することもできますto_proc
。JavaScript とは異なり、バインドされたメソッド (クラスMethod
) とバインドされていないメソッド (クラス) には違いがあります。UnboundMethod
)。オブジェクトからメソッドを取得すると、バインドされます。つまり、そのオブジェクトが認識されます。必要に応じて、バインドを解除して別のオブジェクトにバインドできます。
また、Ruby では、単に をProc
オブジェクトにアタッチしてメソッドにすることはできません。メソッドには、@some_var
では無効な構文 ( など) があるためですProc
。メソッドをオブジェクトに追加するにはinstance_exec
、メソッド定義 ( def
) を使用してブロックに配置します。
つまり、this
in クロージャの概念は、ほとんどの言語には見られない JavaScript 固有の状況を扱います。特に、Ruby ではオブジェクトのメソッドがバインドされたメソッドであり、クロージャをメソッドとして任意に挿入できないため、この問題は発生しません。
self
PS他の人は、クロージャーが定義されている場所からクロージャーにキャプチャすることについてコメントしています。ただし、それthis
は JavaScript の目的ではありません。
self
Rubyオブジェクト内でラムダまたはプロシージャを初期化する場合に使用できます。例えば:
class Example
def name
"Example"
end
def test
lambda{ puts self.name}.call
end
end
example = Example.new
example.test # "Example"
Rubyの詳細については、httpself
: //sidtalk.wordpress.com/2008/10/06/what-exactly-is-ruby-self/を参照してください。