ruby Proc / lambda有一个像'javascript关闭这样的'this'函数吗?

时间:2012-06-20 07:38:48

标签: ruby lambda proc

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

ruby​​ Proc / lambda也有“这个”功能吗?

如果没有,如果我想在红宝石中使用'this',我该怎么办?除了通过参数将当前对象传递给Proc / lambda。

2 个答案:

答案 0 :(得分:2)

如果在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/

答案 1 :(得分:2)

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

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

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

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

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

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

P.S。其他人已经评论了从闭包中定义闭包的self。但是,这根本不是JavaScript中的this