1

在 javascript 闭包中,“this”引用了实际调用函数的对象。

ruby Proc/lambda 也有“this”功能吗?

如果没有,如果我想要 ruby​​ 中的“this”,我该怎么办?除了通过参数将当前对象传递给 Proc/lambda。

4

2 回答 2

4

this通常不是函数或闭包概念的一部分。函数只是你可以用参数调用的东西;“当前对象”与它有什么关系?thisJavaScript 中所有函数中的存在来自于方法在该语言中工作的特殊方式。

在 JavaScript 中,所有函数都有一个概念,this因为在 JavaScript 中,方法和函数之间没有分离。任何函数都可能被用作方法;您可以简单地通过将函数分配为对象的属性来向对象添加方法。此外,在 JavaScript 中,函数没有针对当前对象的显式参数(与 Python 不同);那么方法如何访问其对象呢?当你运行一个方法调用表达式时,它会将你调用它的对象作为隐式this参数传递给函数。但是,如果您使用属性获取函数并像任何其他函数一样手动调用它,this则将是全局对象(或在严格模式下,未定义)。

换句话说,在 JavaScript 中,当您通过属性从对象中获取方法时,它是一个“未绑定方法”——它不知道它来自哪个对象;相反,当您将函数作为按属性的方法放入对象时,该函数不需要知道要从哪个对象开始-对象将在调用时通过方法调用语法神奇地传递给它。您还可以使用函数上的or方法人为this地向函数提供参数(等效于)。.call().apply()obj.foo(x)obj.foo.call(obj, x)

在 Ruby 中,方法和匿名函数是完全分离的。lambda使用、proc或等创建的匿名函数Proc.new是数据,可以存储在变量中。它们的调用语法(call[])与方法不同。方法是使用 定义的def,您不能通过简单地写它的名称(将调用它)将其作为数据获取。可以使用对象method上的方法从对象中获取方法,给出方法名称,然后返回一个Method对象。您可以像使用Method对象一样使用Proc对象,例如您可以调用call它;您甚至可以将其转换为Procwith to_proc。与 JavaScript 不同,绑定方法(类Method)和未绑定方法(类UnboundMethod)。当你从一个对象中得到一个方法时,它就被绑定了——它知道它的对象;如果需要,您可以取消绑定并将其绑定到另一个对象。

此外,在 Ruby 中,您不能只获取 aProc并将其附加到对象并使其成为方法,因为方法的语法(例如@some_var)在Proc. 要向对象添加方法,您可以使用instance_exec方法定义 ( def) 并将其放入块中。

所以简而言之,thisin 闭包的概念处理了 JavaScript 中在大多数语言中都没有的独特情况。尤其是 Ruby 中没有出现这个问题,因为 Ruby 的对象的方法是绑定方法,而且不能任意插入闭包作为方法。

PS其他人评论了self将闭包定义到闭包的位置。然而,这根本不是thisJavaScript 的意义所在。

于 2012-06-20T19:53:59.037 回答
3

self如果您在 Ruby 对象中初始化 lambda 或 proc,则可以使用。例如:

class Example

  def name
    "Example"
  end

  def test
    lambda{ puts self.name}.call
  end

end

example = Example.new
example.test # "Example"

有关 Ruby 的更详细说明,self请参见:http ://sidtalk.wordpress.com/2008/10/06/what-exactly-is-ruby-self/ 。

于 2012-06-20T07:45:41.693 回答