在Ruby Programming Language第6章(第2段)中,他们说:
许多语言都有区别 功能,没有关联 调用的对象和方法 在接收器对象上。因为Ruby是 所有这些都是纯粹面向对象的语言 方法是真正的方法而且是 与至少一个对象相关联。
然后在第6段的中间:
procs和lambdas都是函数 而不是在一个上调用的方法 对象
我对这些陈述有点困惑。 Ruby是纯粹的纯OO,因此没有与对象无关的函数(如果这是纯OO的有效定义),还是与Proc对象关联的procs / lambdas? Ruby中的函数和方法有什么区别?
任何帮助解析和理解这一点都将不胜感激。
答案 0 :(得分:21)
lambda
是Proc类的对象。 Proc
个对象不属于任何对象。调用它们时不将它们绑定到对象上。
方法是类Method
或UnboundMethod
的对象,具体取决于它们是绑定还是未绑定。请参阅解释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之间。可以作为值传递的函数。