为什么使用procs而不是方法?

时间:2012-03-18 20:08:05

标签: ruby proc-object

我是编程的新手,而ruby是我第一次尝试编程。我得到了块,但是procs看起来像一个简单的方法/功能概念 - 为什么要使用它们?为什么不使用方法?

感谢您的帮助。

2 个答案:

答案 0 :(得分:10)

Proc是一段可调用的代码。您可以将其存储在变量中,作为参数传递,然后将其视为first-class value

  

为什么不使用方法?

取决于“方法”的含义。

class Foo
  def bar
    puts "hello"
  end
end

f = Foo.new

在此代码段中,方法bar的使用非常有限。你可以打电话给它,就是这样。但是,如果你想存储对它的引用(传递到其他地方然后调用它),你可以这样做:

f = Foo.new
bar_method = f.method(:bar)

这里bar_method与lambda非常相似(类似于Proc)。 bar_method是一等公民,f.bar不是。

有关详情,请参阅@minitech提到的the article

答案 1 :(得分:8)

调度表设计模式示例


为什么要使用proc而不是方法?

  • 您可能希望动态定义一个行为变化的地方 根据参数。
  • 您可能希望获得方法的句柄 所以你可以把它作为数据引用。

常见的设计模式涉及根据运行时值选择要调用的方法或代码块。例如......

case 1
  when 0
    p :a
  when 1
    p :b
  when 2
    p :c
end

当有许多选择器并且没有办法将递送机制递增到一起时,这会变得很笨拙。所以可以这样做:

h = [ proc { p :a }, proc { p :b }, proc { p :c } ]

h[1].call

如果您的密钥不是一个小整数序列,您也可以使用Hash而不是Array。虽然笨重的案例选择器设计模式经常在所有语言中出现,但很少使用dispatch-of-procs。通常,可以将结果本身存储在ArrayHash中,然后直接将它们编入索引。但是对于复杂的事情,调用proc可以获得最大的灵活性。

当您继续使用Ruby时,您会发现这就是Ruby阻塞的原因。块本质上是作为参数传递给另一个方法的方法。这在Ruby和Smalltalk中很容易实现,因此它一直被使用。你可以在C中做同样的事情,但是它太尴尬了,所以只有当代码编写者正在失去与复杂性的绝望战斗时才能看到它。