Ruby Proc/lambda 有像 javascript 闭包这样的'this'函数吗?



在javascript闭包中,"this"指的是实际进行函数调用的对象。

Ruby Proc/lambda也有"this"函数吗?

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

this一般

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

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

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

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

此外,在 Ruby 中,你不能只获取一个Proc,然后只是将其附加到对象并使其成为方法,因为方法具有语法(例如 @some_var ) 在 Proc 中无效。要将方法添加到对象,可以使用instance_exec并将方法定义(def)放在块中。

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

附言其他人评论了从中定义闭包到闭包的self。然而,这根本不是JavaScript this的意义所在。

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

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/。

最新更新