Ruby函数与方法

时间:2009-05-29 22:40:12

标签: ruby function lambda methods

Ruby Programming Language第6章(第2段)中,他们说:

  

许多语言都有区别   功能,没有关联   调用的对象和方法   在接收器对象上。因为Ruby是   所有这些都是纯粹面向对象的语言   方法是真正的方法而且是   与至少一个对象相关联。

然后在第6段的中间:

  

procs和lambdas都是函数   而不是在一个上调用的方法   对象

我对这些陈述有点困惑。 Ruby是纯粹的纯OO,因此没有与对象无关的函数(如果这是纯OO的有效定义),还是与Proc对象关联的procs / lambdas? Ruby中的函数和方法有什么区别?

任何帮助解析和理解这一点都将不胜感激。

3 个答案:

答案 0 :(得分:21)

Ruby中的

lambda是Proc类的对象。 Proc个对象不属于任何对象。调用它们时不将它们绑定到对象上。

方法是类MethodUnboundMethod的对象,具体取决于它们是绑定还是未绑定。请参阅解释here。在绑定到对象之前,无法调用未绑定的方法。

lambda{|x| x}.class      # => Proc
lambda{|x| x}.call(123)  # => 123

class Foo
  def bar(baz)
    baz
  end
end

puts Foo.new.method(:bar).class     # => Method
puts Foo.new.method(:bar).call(123) # => 123

puts Foo.instance_method(:bar).class     # => UnboundMethod
puts Foo.instance_method(:bar).call(123) # => throws an exception

您可以bind UnboundMethod对象,然后调用它。但你根本不能bind Proc一个对象。但是,Proc个对象可以捕获周围范围内的局部变量,从而成为闭包。

答案 1 :(得分:5)

Procs和lambdas都是自己的对象,使用call方法实际调用与proc(或lambda)相关联的块。但是,Ruby提供了一些语法糖来调用它们而不需要显式调用call

答案 2 :(得分:5)

我认为区别在于方法和first order function之间。可以作为值传递的函数。