2017-04-24 8 views
0

私はレールコントローラの以下の方法を理解しようとしていますRubyの収量のRailsのコントローラ変数

def self.collect_with_max_id(collection=[], max_id=nil, &block) 
     response = yield(max_id) 
     collection += response 
     response.empty? ? collection.flatten : collect_with_max_id(collection, response.last.id - 1, &block) 
    end 

byebugと方法をデバッグしようとしている私は、すべてのオブジェクトのコレクションとmax_idの値を取得する: 私は応答変数を呼び出すとき552860227390144512のmax_idありながら、この部分

response = yield(max_id) 

に引っかかって、私は単純に空の配列[]を取得し、全体の方法を破るようです。

誰かがこのコンテキストでyield関数を説明することができますか。私は今、それを表示とブロックのレンダリングからror。

答えて

0

yieldは、rubyのキーワードであり、メソッドに与えられたブロックを実行するために使用されます。あなたのケースでは

def foo 
    yield 'Hi 1' 
    yield 'Hi 2' 
end 

foo { |string| puts string } 

# Hi 1 
# Hi 2 

ブロックは、あなたが再帰を行うことができます変数&blockで撮影されています

def bar(i = 1, &block) 
    return if i <= 0 

    yield(i) # or you can do block.call(i) 

    bar(i - 1, &block) 
end 

bar(3) { |i| puts "I am called with #{i}" } 

方法があるため、最後の行の再帰を停止します。あなたはresponse.empty?かどうかを尋ねると、それがある場合は、数ヶ月のためにレールを忘れると、そうでない場合は、あなたが傷つくの世界になるだろう、Ruby言語を習得さcollection.flatten

TL & DRに戻ります。

関連する問題