21

我是编程新手,而 ruby​​ 是我第一次真正接触它。我得到了块,但 procs 似乎是一个轻量级的方法/函数概念——为什么要使用它们?为什么不只使用一种方法?

谢谢你的帮助。

4

2 回答 2

11

Proc 是一段可调用的代码。您可以将其存储在变量中,作为参数传递,否则将其视为一等值

为什么不只使用一种方法?

取决于您在这里所说的“方法”是什么意思。

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 提到的文章。

于 2012-03-18T20:12:35.173 回答
9

调度表设计模式示例


为什么使用过程而不是方法?

  • 您可能希望动态定义一个行为根据参数而变化的行为。
  • 您可能想要获取方法的句柄,以便可以将其作为数据引用。

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

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

如果您的键不是小整数序列,您也可以使用 aHash而不是 a。Array尽管笨拙的 case-selector 设计模式在所有语言中都经常出现,但 dispatch-table-of-procs 却很少使用。通常,可以将结果本身存储在Arrayor中Hash,然后直接索引它们。但是对于复杂的事情,调用 aproc可以提供最大的灵活性。

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

于 2012-03-18T20:31:19.713 回答