1

JavaScript クロージャーでは、実際に関数呼び出しを行うオブジェクトへの「this」参照。

ruby Proc/lambdaにも「this」機能がありますか?

そうでない場合、Ruby で「これ」が必要な場合はどうすればよいですか? パラメータによって現在のオブジェクトを Proc/lambda に渡すことを除いて。

4

2 に答える 2

4

this一般に、関数またはクロージャーの概念の一部ではありません。関数は、引数を指定して呼び出すことができる単純なものです。「現在のオブジェクト」はそれと何の関係がありますか? thisJavaScript のすべての関数に存在するのは、メソッドがその言語で動作する独特の方法に由来します。

JavaScript では、メソッドと関数の間に分離thisがないため、すべての関数に の概念があります。どの関数もメソッドとして使用できる可能性があります。関数をオブジェクトの属性として割り当てるだけで、オブジェクトにメソッドを追加できます。さらに、JavaScript では、関数は現在のオブジェクトの明示的なパラメーターを持ちません (Python などとは異なります)。では、メソッドはどのようにしてそのオブジェクトにアクセスできるのでしょうか? メソッド呼び出し式を実行すると、呼び出したオブジェクトが暗黙的なパラメーターとして関数に渡されます。ただし、属性を使用して関数を取得し、他の関数と同じように手動で呼び出すと、グローバル オブジェクトになります (厳密モードでは未定義)。thisthis

つまり、JavaScript で属性によってオブジェクトからメソッドを取得する場合、それは「バインドされていないメソッド」です。元のオブジェクトはわかりません。逆に、関数を属性によるメソッドとしてオブジェクトに入れる場合、その関数は開始するオブジェクトを知る必要はありません。オブジェクトは、呼び出された時点でメソッド呼び出し構文によって魔法のように渡されます。関数でまたはメソッドを使用して、人為的thisに関数に引数を与えることもできます (は と同等です)。.call().apply()obj.foo(x)obj.foo.call(obj, x)

Ruby では、メソッドと無名関数が完全に分離されています。lambdaproc、またはなどを使用して作成された無名関数Proc.newはデータであり、変数に格納できます。メソッドとは異なる構文 (callまたは[]) で呼び出されます。メソッドは を使用して定義されてdefおり、その名前を記述するだけではデータとして取得できません (それが呼び出されます)。オブジェクトのメソッドを使用してオブジェクトからメソッドを取得し、methodメソッド名を指定して、オブジェクトを返すことができMethodます。Methodオブジェクトをオブジェクトのように使用できProcます。たとえば、オブジェクトを呼び出すことができますcallProcwithに変換することもできますto_proc。JavaScript とは異なり、バインドされたメソッド (クラスMethod) とバインドされていないメソッド (クラス) には違いがあります。UnboundMethod)。オブジェクトからメソッドを取得すると、バインドされます。つまり、そのオブジェクトが認識されます。必要に応じて、バインドを解除して別のオブジェクトにバインドできます。

また、Ruby では、単に をProcオブジェクトにアタッチしてメソッドにすることはできません。メソッドには、@some_varでは無効な構文 ( など) があるためですProc。メソッドをオブジェクトに追加するにはinstance_exec、メソッド定義 ( def) を使用してブロックに配置します。

つまり、thisin クロージャの概念は、ほとんどの言語には見られない JavaScript 固有の状況を扱います。特に、Ruby ではオブジェクトのメソッドがバインドされたメソッドであり、クロージャをメソッドとして任意に挿入できないため、この問題は発生しません。

selfPS他の人は、クロージャーが定義されている場所からクロージャーにキャプチャすることについてコメントしています。ただし、それthisは JavaScript の目的ではありません。

于 2012-06-20T19:53:59.037 に答える
3

selfRubyオブジェクト内でラムダまたはプロシージャを初期化する場合に使用できます。例えば:

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/を参照してください。

于 2012-06-20T07:45:41.693 に答える