在周围区块的上下文中调用proc

时间:2013-07-22 19:47:30

标签: ruby sinatra

我有一个Procs数组,我想在封闭块的上下文中调用所有这些,并返回最后一个值。具体做法是:

require 'sinatra/base'

class App < Sinatra::Base
end

procs = [ proc{ status 200 }, proc{ 'Success!' } ]
App.send('get', '/') do
  procs.map(&:call).last
end

App.run!

No method 'status'出错。我希望它表现得像:

class App < Sinatra::Base
  get '/' do
    status 200
    'Success!'
  end
end

知道我该怎么做吗?

2 个答案:

答案 0 :(得分:3)

您可以使用instance_eval更改过程的绑定:

App.send('get', '/') do
  procs.map{|p| instance_eval(&p) }.last
end

答案 1 :(得分:0)

您正在设置超出App范围的过程,这是定义状态方法的位置。所以你没有得到你期望的绑定。将定义移到类中,切换到lambdas对我有用。 Lambdas是真正的闭包,所以这是有道理的。

考虑

  class App < Sinatra::Base
    procs = [ -> { status 200 }, -> { 'Success!' } ]

    get '/' do
      procs.map(&:call).last
    end
  end