Ruby Lambda 在与 myfunc 一起使用时给出了未定义的方法。(someparam)

Ruby Lambda's giving an undefined method when used with myfunc.(someparam)

刚刚进入 Ruby 的世界,并建立了一个基于 Sinatra 的 API。

这是我的路线定义之一。 not_found 在调用为 ¬_found 时有效,但它给出 '2015-10-23 16:31:59 - NoMethodError - Sinatra::FileService::GetFiles:Module 的未定义方法“状态”:' 当调用为 ' not_found.(参数['obsId'])'.

有人可以提供任何指导吗?非常感谢!

 def self.registered(app)

    not_found = -> id = 'undefined' {
      status 404
      content_type :json
      { 
        :message => settings.messages['get']['404'], 
        :data => {
          id: _id
        } 
      }.to_json
    }

    found = -> _id { 
      status 200
      content_type :json
      { 
        :message => settings.messages['get']['200'], 
        :data => {
          :id => _id
        }
      }.to_json
    }

    app.get '/', &not_found

    app.get '/:obsId' do

      if params['obsId'] == '1'
        found.( params['obsId'] )
      else 
        not_found.( params['obsId'] )
      end

    end

  end

你是 运行宁 Ruby 1.8 吗? .() 语法当时不存在。您必须在 1.8 中使用以下两种表示法之一:

found[params['obsId']]

found.call(params['obsId'])

但是在 Ruby 1.8 中,定义 lambda 的 -> {} 语法也不存在。您可能 运行 会遇到更多错误,需要将您的 lambda 定义替换为

found = lambda do |id|
  # ...
end

看来这是一个范围界定问题。似乎当您使用默认参数调用 lambda 时,它会保持外部范围。但是当你传入参数时,它会创建一个新的内部范围。

更新我对 found.call( params['obsId'], settings.messages['get']['200'] ) 的调用解决了这个问题。