2014-05-20 31 views
2

當使用RestClient庫,我可以得到一個GET這樣的responseRuby方法如何發送不同數量的變量?

resource = RestClient::Resource.new some_url 
resource.get do |response| 
    # Handle response 
end 

我還可以添加requestresult參數:

resource.get do |response, request, result| 
    # Handle response, request, and result 
end 

如何紅寶石返回一個像這樣的多個值?

回答

5

訣竅是,當在Ruby中產生塊時,您可以簡單地傳遞任何人都會關心的值。然後,當您創建塊時,您可以簡單地捕獲傳遞到塊中的第一個,第二個,...或所有值。就好像所有塊參數(在你的情況下,response,requestresult)是可選的。

def eat(meal) 
    meal.each { |food| yield(food, 99, 100) } 
    'delicious!' 
end 

eat([1, 2, 3]) { puts "Yum!" } 
# Output: 
Yum! 
Yum! 
Yum! 
=> "delicious!" 

eat([1, 2, 3]) { |a| puts "Yum! #{a}" } 
# Output: 
Yum! 1 
Yum! 2 
Yum! 3 
=> "delicious!" 

eat([1, 2, 3]) { |a, b, c| puts "Yum! #{a}, #{b}, #{c}" } 
# Output: 
Yum! 1, 99, 100 
Yum! 2, 99, 100 
Yum! 3, 99, 100 
=> "delicious!" 

注意如何eat方法沒有改變,只是你提供給該方法的塊。我們只是修改它以接受更多的參數(並對它們進行一些操作)。

3

調用塊的方法通常不會傳遞不同數量的參數,具體取決於塊的arity(儘管可以這樣做)。在通常的實現中,塊調用會傳遞塊可以採用的最大參數個數。 它可以接受不同數量的塊參數

假設foo需要一個塊,並調用它像這樣:

def foo *args, &block 
    block.call(*args) 
end 

有幾種情況需要考慮。

  • 當塊的元數等於傳遞的參數的數目,則每個塊參數將接收每個參數傳遞:

    foo(:foo, :bar){|a, b| puts "a = #{a}", "b = #{b}"} 
    # => a = foo 
    # => b = baz 
    
  • 當塊的元數是小於的數量參數傳遞,然後每個塊參數將在相應的位置接收參數的值;額外的參數將不會被傳遞:

    foo(:foo, :bar, :baz){|a, b| puts "a = #{a}", "b = #{b}"} 
    # => a = foo 
    # => b = bar 
    
  • 當塊的元數比通過,那麼額外的塊參數將被分配的參數的數量更大nil(除非以下的情況下):

    foo(:foo, :bar){|a, b, c| puts "a = #{a}", "b = #{b}", "c = #{c}"} 
    # => a = foo 
    # => b = bar 
    # => c = 
    
  • 當塊的元數比的傳遞的參數的數目更大,並且陣列可以在某種程度上分配更多的塊參數被破壞,那麼破壞將被應用:

    foo([:foo, :bar, :baz]){|a, b| puts "a = #{a}", "b = #{b}"} 
    # => a = foo 
    # => b = bar