传递给块的参数

时间:2016-01-25 04:41:43

标签: ruby rest-client

This article的文档包含以下示例:

RestClient.get('http://my-rest-service.com/resource'){ |response, request, result, &block|
  case response.code
  when 200
    p "It worked !"
    response
  when 423
    raise SomeCustomExceptionIfYouWant
  else
    response.return!(request, result, &block)
  end
}

您如何知道上面每个块变量可用的属性? responserequest等分别具有哪些属性?当我运行rest_client时:

response = RestClient.get('http://www.google.com')

许多内容都以response的形式返回:

response.instance_variables # => [:@net_http_res, :@args, :@request, :@code]
response.net_http_res # => #<Net::HTTPOK 200 OK readbody=true>
response.args # => {:method=>:get, :url=>"http://www.google.com", :headers=>{}}
response.code # => 200

response的哪些部分可用?参数的顺序是否重要?

4 个答案:

答案 0 :(得分:3)

通常,接受块的方法可选地会这样说:

def f(...)
  if block_given?
    ...
    yield thing1, thing2...
    ...
    return foo
  else
    ...
    return bar
  end
end

因此,不需要在块中产生什么与在没有阻塞的情况下返回的内容之间存在任何对应关系。

了解块接收内容的方法是查看方法的文档,或查阅源代码。

是的,订单很重要。 gem文档明确指出RestClient#get为您提供responserequestresultblock;它还描述了那些东西。

答案 1 :(得分:1)

来自process_result中的restclient/request.rb方法:

  if block_given?
    block.call(response, self, res, & block)
  else

这是调用块的位置。由于self此处为Request,因此该块的参数为responserequestresult以及block本身订购。

仅当block_given?为真时才调用该块。因此,如果您在问题中显示,调用RestClient.get没有阻止,会给它一个不同的行为。

  

该块可以获得哪些响应?

将整个Response对象作为第一个参数提供给块。

  

参数的顺序是否重要?

是的,参数的顺序绝对重要。

答案 2 :(得分:0)

我不知道你拥有的特定宝石,但一般来说,检查课程:

p response.class

然后查找该类的文档,或直接查看它具有的方法:

p response.methods

答案 3 :(得分:0)

response = RestClient.get('http://www.google.com')

当您解雇此内容时,您可以为整个可用列表提供类似 response.methods 的内容。这个很大,所以请参考文档/ github页面,了解常用方法。所有方法的响应变量都可以直接使用和传递。

是的,参数的顺序很重要。