2016-01-25 5 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 
} 

Как вы знаете, какие атрибуты доступны по каждой переменной блока выше? Какие атрибуты имеют response, request и т. Д., Соответственно? Когда я бегу 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, result и 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, result и самим block в этом конкретном порядке.

Блок вызывается, только если block_given? является истинным. Поэтому вызов RestClient.get без блока, как вы показали в вопросе, дает ему другое поведение.

Какие части отклика доступны блоку?

Весь объект Response передается блоку в качестве первого параметра.

Означает ли порядок параметров?

Да, порядок параметров определенно имеет значение.

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

когда вы стреляете это, вы можете иметь что-то вроде response.methods для всего списка доступных. Это довольно большой, поэтому обратитесь к документации/странице github для общеупотребительных методов. Ответная переменная со всеми методами доступна для использования и передается напрямую.

Да, порядок параметров имеет значение.