ruby Proc/lambda是否有类似javascript闭包的“this”函数?

ruby Proc/lambda是否有类似javascript闭包的“this”函数?,ruby,lambda,proc,Ruby,Lambda,Proc,在javascript闭包中,“this”引用实际进行函数调用的对象 ruby Proc/lambda是否也有“this”函数 如果不是,如果我想要ruby中的“this”,我应该怎么做?除了通过参数将当前对象传递给Proc/lambda之外。如果在Ruby对象中初始化lambda或Proc,则可以使用self。例如: class Example def name "Example" end def test lambda{ puts self.name}.cal

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

ruby Proc/lambda是否也有“this”函数

如果不是,如果我想要ruby中的“this”,我应该怎么做?除了通过参数将当前对象传递给Proc/lambda之外。

如果在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的更详细解释,请参见:。

如果在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自身的更详细解释,请参见:。

一般来说,这不是函数或闭包概念的一部分。函数只是一个可以用参数调用的东西;当前对象与它有什么关系?JavaScript中所有函数中都存在这种情况,这源于该语言中方法的特殊工作方式

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

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

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

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

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

另外,其他人对从封闭定义到封闭的地方捕捉自我发表了评论。然而,这根本不是JavaScript中的内容。

这不是函数或闭包概念的一部分。函数只是一个可以用参数调用的东西;当前对象与它有什么关系?JavaScript中所有函数中都存在这种情况,这源于该语言中方法的特殊工作方式

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

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

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

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

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


另外,其他人对从封闭定义到封闭的地方捕捉自我发表了评论。然而,这根本不是JavaScript中的内容。

那里甚至不需要自我。@AndrewMarshall正确。我之所以包含它,是因为问题是Ruby是否引用了实际进行调用的对象。self就是那个引用。我认为这里的“self”指的是定义它的对象,而不是真正发出调用的对象。那里甚至不需要self。@AndrewMarshall正确。我之所以包含它,是因为问题是Ruby是否引用了实际进行调用的对象。self就是那个引用。我认为这里的self指的是定义它的对象,而不是真正发出调用的对象。