0

我有一个 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

知道我该怎么做吗?

4

2 回答 2

3

您可以使用instance_eval来更改 procs 的绑定:

App.send('get', '/') do
  procs.map{|p| instance_eval(&p) }.last
end
于 2013-07-22T20:45:40.390 回答
0

您在 App 范围之外设置 procs,这是定义状态方法的地方。所以你没有得到你期望的绑定。将定义移到类中并切换到 lambdas 对我有用。Lambda 是真正的闭包,所以这是有道理的。

考虑

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

    get '/' do
      procs.map(&:call).last
    end
  end
于 2013-07-22T20:25:15.160 回答