什么时候在Ruby中使用Procs?

什么时候在Ruby中使用Procs?,ruby,Ruby,我读过几本关于Ruby的书,我了解如何创建和调用Proc。但这些书中的例子都是人为的、琐碎的。我想知道什么时候使用Proc比使用传统方法做同样的事情更有用?也许有人可以发布一个不平凡的例子?在Ruby中,a是一种很好的方法,可以存储一些稍后要在对象中运行的代码。块不是对象,但可以轻松地转换为过程。PROC对很多事情都很有用。PROC通常用于实现。我最近在编写系统模拟时使用了Procs。每次我在模拟中调用步骤方法时,我都希望发生各种事情。我不想让模拟对象本身知道这些事情的细节;我只是想让它调用我定

我读过几本关于Ruby的书,我了解如何创建和调用Proc。但这些书中的例子都是人为的、琐碎的。我想知道什么时候使用Proc比使用传统方法做同样的事情更有用?也许有人可以发布一个不平凡的例子?

在Ruby中,a是一种很好的方法,可以存储一些稍后要在对象中运行的代码。块不是对象,但可以轻松地转换为过程。PROC对很多事情都很有用。PROC通常用于实现。我最近在编写系统模拟时使用了Procs。每次我在模拟中调用
步骤
方法时,我都希望发生各种事情。我不想让模拟对象本身知道这些事情的细节;我只是想让它调用我定义的回调。通过定义一组自定义类或对象,每个类或对象都有一个
调用
方法,我本可以完成同样的事情,但使用Procs显然更简单

class X
  def initialize
    @step_callbacks = []
  end

  def every_step(&proc)
    # If you print proc.class here, you can see it is a Proc
    @step_callbacks << proc
  end

  def step
    # ...perform the step...
    @step_callbacks.each do |proc|
      proc.call
    end
  end
end

x = X.new

x.every_step do
  # check some assertions about the state of the simulation
end

x.every_step do
  # update a related simulation
end

x.step
x.step
X类
def初始化
@步骤_回调=[]
结束
定义每个步骤(&proc)
#如果您在这里打印proc.class,您可以看到它是一个proc

@step_callbacksProc是一个对象,因此您可以创建包含它们的复杂对象。例如,您可以创建一个将键与指令匹配的哈希:

object1 = {
  :foo => ->{execute_foo_routine},
  :bar => ->{execute_bar_routine},
  ...
}
...
object1[:foo].call # => execution
请注意,所有信息都包含在
object1
中。当您希望封装所有必要的信息并使其独立于外部代码时,这非常有用<代码>对象1
是可移植的

如果您想使用方法来实现这一点,那么并非所有信息都可以放在对象中,但需要在其他地方定义方法:

object2 = {
  :foo => :foo_routine,
  :bar => :bar_routine,
  ...
}

def foo_routine
  ...
end
def bar_routine
  ...
end
...
send(object2[:foo]) # => execution

和<代码> Objult2不会像<代码> Objist1。< /P>你认为什么是“做同一件事的传统方法”?我想我是指调用一个我想在它里面预定义的代码的方法,而不是将块转换成一个PROC,然后调用Ruby PROCE/LAMBDA在Ruby中到处使用…像each、map等。这个问题是出于无知……为什么不把要转换成Proc的每个块都转换成一个方法呢?这将需要更多的代码行,并且需要您创建新的方法名称。另外,它可能需要您创建一个额外的对象来接收该方法调用。第一个示例使用

labmda
procs,第二个示例使用
send
根本不使用procs。另外,如果你误读了我的答案,总是使用
public\u-send
over
send
@naomik。您提到的“第二个示例”是一个不使用procs的示例,作为与使用procs的示例的比较发布。