2009-05-29 59 views
27

Ruby Programming Language,第6章(第二段)他们的状态:红宝石功能VS方法

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

然后在第6段落的中间:

两个特效和lambda表达式是调用的 对象上的功能 ,而不是方法。

我对这些说法有些困惑。 Ruby是否是真正的纯OO,因此没有与对象关联的函数(如果这是纯OO的有效定义),或者是与Proc对象关联的procs/lambdas? Ruby中的函数和方法有什么区别?

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

回答

21

lambda在Ruby中是类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 

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

5

Procs和lambdas本身都是对象,call方法实际上调用与proc(或lambda)关联的块。但是,Ruby不提供对call的明确调用,就会提供一些语法糖来调用它们。

+0

是的,proc和lambdas都是Proc对象,但它们是什么意思是“函数而不是方法”。有什么区别? – 2009-05-29 22:48:40