2016-01-25 79 views
1

rest_client gem有以下示例中的文件:参数传递给块

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可用来块?参数的顺序是否重要?

回答

3

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

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

因此,并不需要是什么之间的产生来将挡,并在情况下,返回了任何信件没有阻止。

知道块接收的方法是查看该方法的文档或查阅源代码。

是的,订单很重要。宝石文件特别说RestClient#get给你response,request,和block;它也描述了这些东西是什么。

0

我不知道你有特别的宝石,但在一般情况下,检查类:

p response.class 

,然后寻找这个类的文档,或直接看什么方法它有做:

p response.methods 
1

process_result方法在restclient/request.rb

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

这是块被调用的地方。由于self这里是Request,给出该块的参数是response,request,resultblock本身按该特定顺序。

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

块的哪些部分可用?

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

参数的顺序是否重要?

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

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

当您启动此,你可以像response.methods可用的完整列表。这是非常大的,所以参考文档/ github页面的常用方法。所有方法的响应变量都可以使用并直接传递。

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