方法和proc对象有什么区别?

时间:2014-12-06 07:07:09

标签: ruby methods lambda proc

我知道 Ruby 中的方法不是对象,而是procs和lambdas。除此之外,他们之间有什么区别吗?因为我们都可以传球。是什么让proc对象与方法不同?

方法:

1.8.7-p334 :017 > def a_method(a,b)
1.8.7-p334 :018?>   puts "a method with args: #{a}, #{b}"
1.8.7-p334 :019?>   end
1.8.7-p334 :021 > meth_ref = Object.method("a_method")
 => #<Method: Class(Object)#a_method> 
1.8.7-p334 :022 > meth_ref.call(2,3)

Proc对象:

  a = lambda {|a, b| puts "#{a}, #{b}"}
  a.call(2,3)

2 个答案:

答案 0 :(得分:6)

你在问题​​中说过&#34;方法不是对象&#34;但是你必须要小心区分&#34;方法&#34;和Method

A&#34;方法&#34;是一组已定义的表达式,它们被赋予一个名称并放入特定类的方法表中,以便以后轻松查找和执行。

Method对象(或类似的UnboundMethod对象)是通过调用method / instance_method /等创建的实际Ruby对象并传递&的名称#34;方法&#34;作为论点。

您可能会发现阅读UnboundMethodMethodProc的RDoc文档非常有用。 RDoc页面列出了每种类型可用的不同实例方法。

基本上,Method对象是&#34;绑定&#34;到某个对象,以便self在您call方法时指向该对象,并且Proc没有该行为; self取决于创建/调用Proc的上下文。

答案 1 :(得分:2)

块和过程之间的差异

  1. Procs是对象,块不是
  2. 最多一个块可以出现在参数列表中
  3. procs和lambdas之间的差异

    1. Lambdas检查参数的数量,而procs不是
    2. Lambdas和procs区别对待return关键字
    3. 这里解释得很好(我刚从下面的链接中复制了它)

      http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/